Overview

学习JVM首先需要了解一下JVM管理的内存是如何分布的,在看了《深入理解Java虚拟机》和一些博文之后,我准备自己记录一下学习的过程。

下图是JVM中运行时数据区的大致示意图,可以看到主要分为两种内存区域,一种是线程私有的内存区,另一种是所有线程共享的区域。下面会详细描述每个区域存储哪些数据。

程序计数器

我们知道JVM是通过解释Java编译之后的字节码来执行程序的,那么JVM是怎么知道执行到哪一行字节码了呢?答案就是通过程序计数器来指示当前线程执行的字节码行号。我认为应该是JVM模仿CPU中的程序计数器来设计的。

  • 需要注意的是每个线程都有自己私有的一个程序计数器,从而保证互相不干扰。同一时刻一个CPU内核只能执行一个线程上的代码。

  • 当执行Java方法时程序计数器会起作用,但是执行Native方法时计数器值为空。

  • 程序计数器区是JVM内存区中唯一一个不会触发OutOfMemory(OOM)异常的区域。

Java虚拟机栈

Java虚拟机栈也是专属于线程的内存区域,在线程执行每个方法时都会创建一个栈帧(Stack Frame),栈帧中存放了局部变量表、操作数栈、动态链接(reference)等信息。

  • 当线程请起的栈深度大于虚拟机允许的最大深度,就会出发Stackoverflow异常;
  • 如果虚拟机栈允许动态扩展,当无法申请足够内存时会出发OOM异常。

本地方法栈

本地方法栈与Java虚拟机栈的区别就是Java虚拟机栈为Java方法服务,而本地方法栈服务的是Native方法。有些虚拟机会把二者合一,比如HotSpot VM。本地方法栈也会抛出Stackoverflow和OOM异常。

堆是JVM中最大的一块内存区域,主要是用来存放对象实例,几乎所有的对象实例都在堆上分配。

堆也是垃圾收集器(GC)管理的主要工作区域。GC基本采用分代回收算法,所以Java堆可以分为新生代(Young Generation)和老年代(Old Generation),更细一点可以分为Eden、From Survivor空间和To Survivor空间。

Young Generation:主要是用来存放新生的对象,也是GC最经常发生的区域。

Old Generation:主要存放应用程序中生命周期长的内存对象,GC较少发生。

可以通过设置VM参数来扩展堆的大小:

  • -Xms:初试堆大小
  • -Xmx:堆最大大小
  • -XX:NewSize=n :设置年轻代大小
  • -XX:NewRatio=n: 设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
  • -XX:SurvivorRatio=n :年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5

堆也可以抛出OOM异常。

方法区

方法区和堆一样是所有线程共享的内存区域,用于存储虚拟机加载的类信息、metadata、常量、静态变量、JIT编译器编译后的代码等数据,一般称为永生代(Permanent Generation),GC基本不会对永生代进行垃圾收集。

当方法区无法满足内存分配需求时也会抛出OOM异常。

运行时常量池

运行时常量池是方法区中的一部分,用于存放编译期生成的字面量和符号引用。

题外话

直接内存

直接内存不属于JVM管理的内存区域,但是也被频繁使用,其中最典型的例子就是NIO库,在之前一篇文章介绍过。NIO引入了channel和buffer,使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象来作为堆外内存的引用进行操作。这样避免了数据在Java堆和Native堆之间的复制,从而提升性能。

同样,该区域也会抛出OOM异常。

转载于:https://www.cnblogs.com/puyangsky/p/6208370.html

【JVM学习笔记一】JVM内存分布相关推荐

  1. java之jvm学习笔记十三(jvm基本结构)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完 ...

  2. JVM学习笔记之-JVM性能监控-JVM监控及诊断工具-命令行方式

    性能优化的步骤 第1步(发现问题):性能监控 一种以非强行或者入侵方式收集或查看应用运营性能数据的活动. 监控通常是指一种在生产.质量评估或者开发环境下实施的带有预防或主动性的活动. 当应用相关干系人 ...

  3. JVM 学习笔记 1. JVM 运行模型

    目录 JVM 启动流程 JVM 基本结构 内存模型 虚拟机的运行方式 1. JVM 启动流程 如下图所示: 2. JVM 基本结构 两幅经典的模型图: 其中: PC寄存器:每个线程都拥有一个PC寄存器 ...

  4. JVM学习笔记之-JVM性能监控-JVM监控及诊断工具-GUI方式-Visual VM-JProfiler-Arthas

    00-谈GUI工具前的补充 补充1:内存泄漏 内存泄漏的理解与分类 何为内存泄漏( memory leak) 可达性分析算法来判断对象是否是不再使用的对象,本质都是判断一个对象是否还被引用.那么对于这 ...

  5. 【JVM学习笔记】内存回收与内存回收算法 就哪些地方需要回收、什么时候回收、如何回收三个问题进行分析和说明

    目录 一.相关名词解释 垃圾收集常用名词 二.哪些地方需要回收 本地方法栈.虚拟机栈.程序计数器 方法区 Java堆 三.什么时候回收 1. 内存能否被回收 内存中的引用类型 引用计数算法 可达性分析 ...

  6. JVM学习笔记(四)------内存调优

    首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提 ...

  7. 【JVM 学习笔记 05】:JVM性能调优工具的使用和优化案例

    [JVM 学习笔记 05]:JVM性能调优工具的使用 1. 使用 jstat(命令行工具) 查看线上系统的JVM运行状况 1.1 常用命令 1.2 使用技巧 1.2.1 随着系统运行,每秒钟会在年轻代 ...

  8. JVM学习笔记(Ⅰ):Class类文件结构解析(带你读懂Java字节码,这一篇就够了)

    JVM学习笔记(Ⅰ):Class类文件结构解析,带你读懂Java字节码 前言:本文属于博主个人的学习笔记,博主也是小白.如果有不对的地方希望各位帮忙指出.本文主要还是我的学习总结,因为网上的一些知识分 ...

  9. JVM学习笔记汇总:结合尚硅谷宋红康老师视频教程及PPT

    JVM学习笔记汇总:结合尚硅谷宋红康老师视频教程及PPT 第一章:JVM虚拟机的介绍 1.1虚拟机的分类 虚拟机通常分为两类:系统虚拟机和程序虚机.其中,系统虚拟机是指完全对物理计算机的仿真,而程序虚 ...

  10. JVM学习笔记(四)

    JVM学习笔记(四) 文章目录 JVM学习笔记(四) 笔记链接 1.GC算法 1.1GC-判断对象是否可回收 1.1.1 引用计数法 1.1.1 可达性分析 1.2GC-回收算法 标记清除法(Mark ...

最新文章

  1. Jupyter Notebook快捷键
  2. 日本政府用AI分配对象了!给你分一个的话,敢不敢要?
  3. 利用logistic回归构建申请信用评级案例
  4. Celery框架简单实例
  5. PHP内存管理机制与垃圾回收机制
  6. 网站服务器令牌获取,adobe - 获取Adobe Sign访问令牌以进行服务器到服务器身份验证 - 堆栈内存溢出...
  7. 在VS2013平台下如何快速解决c++代码内存泄漏问题
  8. 闭包造成的内存泄露怎么解决?
  9. 中国银联深夜道歉 称将进一步优化赔偿机制
  10. eclipse安装WindowBuilder Pro组件
  11. js 从一个json拼接成另一个json,并做json数据分页table展示
  12. 如何查看网站被搜索引擎收录的情况
  13. MMORPG开发入门[转]
  14. linux怎么调显卡风扇速度,Ubuntu下无显示器(服务器)手动调节Nvidia显卡风扇转速...
  15. 报错Field Mapper in xxx.xxxServiceImpl required a bean of type ‘dao.xxxMapper‘ that could not be found
  16. stm32f407能跑linux吗_stm32能跑linux吗
  17. C 递归 详解(通俗易懂)
  18. Scala系列20:Scala中异常捕获与抛出异常
  19. (转)Moodle平台简介
  20. Python之文件 打开与关闭

热门文章

  1. ORG LegacyCell for Mac - MS-20/Polysix音频合成器
  2. Output Arcade Utility Tool for Mac(Arcade音色库破解导入工具)
  3. macOS 12兼容机型列表 想知道你的Mac是否支持macOS Monterey吗?
  4. 如何使用iMazing将iPhone的数据迁移到iPad
  5. 为什么最好不用SSL免费证书? 免费ssl证书有什么不好?
  6. 用Python3开发简单应用——兽人之袭
  7. 软工网络15团队作业4——Alpha阶段敏捷冲刺-3
  8. mysql 去除空格
  9. postgresql----时间类型
  10. 牛腩新闻发布系统 (6) 在线浮动的客服功能