1. 上帝视角

【树看JVM】

【图看JVM】

2. 分而治之

2.1 堆区

构成:堆区由新生代和老年代组成,新生代中包含伊甸区(Eden)、幸存者区(survivor from 、survivor to)和老年代。

GC:当创建新的对象时,对象首先会被放入Eden和survivor from中,每经历一次GC存活下来的对象,年龄都会加1。在进行了第一次GC后,在Eden中仍然存活的对象,将被放入survivor to ;而survivor from中的存活的对象将由年龄阀值(maxTenuringThreshold)来决定,如果年龄不超过maxTenuringThreshold的话,将被放入survivor to,如果超过的话,就被放入老年代。

在经历GC之后,Eden和survivor from 都被清空,此时,原先的survivor from转变为survivor to的角色,原先的survivor to转变成survivor from的角色,下一次的GC将会依据上一个原理,继续进行。当survivor to满了之后,survivor to 中的对象将会被放入老年代。

除了年龄阀值会触发对象晋升到老年代之外,还有以下第二种情况能够触发:

前提:survivor to中,相同年龄的对象所占的空间超过一半。

触发:对象的年龄超过了上述前提中对象的年龄,就会直接被放入老年代。

因此,幸存者区存放的数据是Eden区GC后拷贝过来的数据,老年代存放的是数据是幸存者区GC后拷贝过来的数据

2.2 栈区

栈区中存储的是一个一个的栈帧(stack frame),每一个栈帧对应一个被调用的方法,它与方法的生命周期一致,随着方法的调用而被创建,随着方法的结束而销毁。栈帧中存放的是局部变量表(基本数据类型、引用),操作数栈、指向当前方法所属的类的运行时常量池的引用等信息。(运行时常量池在方法区中)。

2.3 方法区

方法区由代码缓存、运行时常量池、持久代(JDK1.8后被删除)组成。

· 持久代:在JDK1.6时方法区存放的是类的结构定义、方法、构造函数、以及存放静态变量,在JDK1.7之后,方法区的持久代被删除,取而代之的是元空间(metaSpace),元空间在本地内存中,与持久代类似,是对JVM规范中方法区的实现。

· 代码缓存:代码缓存中存放的是JIT(just in time)编译器编译后的与硬件相关的代码。可以通过ReservedCodeCacheSize 和 InitialCodeCacheSize两个参数设置。

· 运行时常量池:被所有线程共享,存储的是虚拟机加载Class之后的常量池数据(常量池是Class的一部分,存储着类、接口、方法中的常量)

2.4 元空间(metaSpace)

元空间在JDK1.7时开始取代方法区中的持久代(PermGen),那么,为什么要删除持久代,让元空间取而代之?官方解释如下图:

从官方的解释可以看出,由于JRokit中没有持久代而不需要配置,而删除持久代是官方为了融合JRockit与HotSpot所努力的一部分,所以在JDK1.7开始逐步开始取代持久代,到JDK1.8之后彻底删除。

并且,类和方法的信息大小难以确定,永久带经常会发生内存溢出(OOM),java.lang.OutOfMemoryError: PermGen

(关于元空间的溢出,在下篇博文与其它内存溢出的异常一起整理,这里就不再赘述元空间的OOM)

2.5 本地方法栈

与前面谈到的虚拟机栈类似,区别在于虚拟机栈为虚拟机调用的Java方法服务,本地方法栈是为虚拟机调用的本地方法(Native Method)服务。

Mative Method是一个Java调用一个非Java程序的接口,该方法的实现由非Java语言来实现

-------------------------

以下描述截取自《深入理解Java虚拟机:JVM高级特性与最佳实践》 作者: 周志明

本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。虚拟机规范中对本地方法栈中的方法使用的语言、使用方式与数据结构并没有强制规定,因此具体的虚拟机可以自由实现它。甚至有的虚拟机(譬如Sun HotSpot虚拟机)直接就把本地方法栈和虚拟机栈合二为一。与虚拟机栈一样,本地方法栈区域也会抛出StackOverflowError和OutOfMemoryError异常。

-----------------------------------------

2.6 程序计数器(PC)

程序计数器记录的是线程下一步要执行的指令字节码地址。在多线程中,各线程之间是抢CPU的关系,要根据抢得时间片的CPU时间资源进行线程切换,因此,每个线程都有一个独立的程序计数器,记录各个线程下一步要执行的指令,这样才能够正常切换。

参考及推荐:

java上帝模块常见的情况_JVM上帝视角看JVM内存模型,分而治之论各模块详情详解...相关推荐

  1. 【JVM】上帝视角看JVM内存模型,分而治之论各模块详情

    1. 上帝视角 [树看JVM] [图看JVM] 2. 分而治之 2.1 堆区 构成:堆区由新生代和老年代组成,新生代中包含伊甸区(Eden).幸存者区(survivor from .survivor ...

  2. 《深入理解Java虚拟机》读后总结(一)JVM内存模型

    基于Sun HotSpot JVM 直接上图: 从图中看到,JVM内存分为两个主要区域,一个是所有线程共享的数据区,一个是线程隔离数据区(线程私有) 线程隔离数据区 程序计数器(Program Cou ...

  3. 深入java虚拟机需要读吗_《深入理解Java虚拟机》读后总结(一)JVM内存模型

    <深入理解Java虚拟机>读后总结 基于Sun HotSpot JVM 直接上图: 从图中看到,JVM内存分为两个主要区域,一个是所有线程共享的数据区,一个是线程隔离数据区(线程私有) 线 ...

  4. Java JVM内存模型

    简述JVM内存模型 线程私有的运行时数据区: 程序计数器.Java 虚拟机栈.本地方法栈. 线程共享的运行时数据区:Java 堆.方法区. 简述程序计数器 程序计数器表示当前线程所执行的字节码的行号指 ...

  5. jvm内存模型_JVM内存模型的相关概念

    1.前言 Android的虚拟机是根据移动设备的特点基于Java虚拟机(JVM)改进而来,虽然没有保留规范,但作为Java语言的使用者,了解一下JVM的规范还是有必要的. 2.JVM内存模型 JVM在 ...

  6. 深入理解Java虚拟机学习笔记-1.JVM内存模型

    JVM内存模型 1.内存模型结构图 名称 特征 作用 配置参数 异常 程序计数器 占用内存小,线程私有, 生命周期与线程相同 大致为字节码行号指示器 无 无 虚拟机栈 线程私有,生命周期与线程相同,使 ...

  7. JVM(Java虚拟机)详解(JVM 内存模型、堆、GC、直接内存、性能调优)

    JVM(Java虚拟机) JVM 内存模型 结构图 jdk1.8 结构图(极简) jdk1.8 结构图(简单) JVM(Java虚拟机): 是一个抽象的计算模型. 如同一台真实的机器,它有自己的指令集 ...

  8. java实现初始化三角形数组_Java 数组、多维数组,动态、静态初始化,数组JVM内存模型分析...

    Java 数组.多维数组,动态.静态初始化,数组JVM内存模型分析 什么是数组 所谓数组,是具有相同数据类型的若干变量或者数据按照一定排序规则组合起来的一种数据存储格式.数组中的数据称为数组元素,我们 ...

  9. java面试-深入理解JVM(一)——JVM内存模型

    JVM内存模型 Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是:  1. 程序计数器  2. Java虚拟机栈  3. 本地方法栈  4. 堆  5. ...

最新文章

  1. ai 临摹图片换背景_AI临摹绘制插画图片
  2. 关于站在主管的角度来看企业用人的一些规则
  3. nfvo通过调用哪个接口实现对vnf生命周期的管理_Spring-Bean生命周期
  4. 前端学习(2958):组件之间的参数传递子传父
  5. Entity Framework 4 in Action读书笔记——第四章:使用LINQ to Entities查询:预先加载和延迟加载...
  6. npm install全局安装的模块路径自定义管理
  7. mysql 线程id_查找MySQL线程中死锁的ID的方法
  8. 应用统计学跟统计学_在实践中使用地统计学
  9. icon 的css,【iview】icon样式
  10. 伦敦大学金史密斯学院计算机专业,伦敦大学金史密斯学院计算机与信息系统本科.pdf...
  11. 儒家文化专题数据:各地级市-儒家学校、学堂孔庙数据量
  12. 项目开发成本高周期长 数维图低代码平台解决行业痛点
  13. mysql skewed_Hive分区字段含中文报错问题解决方案
  14. 虚幻4皮肤材质_虚幻引擎4.5版本预览说明
  15. 我的大学-5-34-林陆
  16. 上手 WebRTC DTLS 遇到很多 BUG,怎么解?
  17. QGIS加载无偏移卫星地图URL
  18. python学习笔记_第21天(文件操作--IO 技术)
  19. matlab自动驾驶工具箱,MATLAB,Simulink. -  Automated Driving System Toolbox, 自動駕駛系統工具箱-鈦思科技...
  20. 《Linux 工作站安全检查清单》——来自 Linux 基金会内部

热门文章

  1. QTP的飞机登录描述性编程
  2. bootstrap 仿实例
  3. 无法启动windows安全中心服务
  4. 定制软件项目经理应该善于说“NO”
  5. 21day学通python_python21day
  6. JavaScript快速上手
  7. “拼多多优惠券”测试的套路,今天让你秒懂~
  8. 软件测试薪资标准新鲜出炉,你达标了吗?
  9. 捷克论坛最新ip地址_最新macOS破坏SSH默认规则,程序员无法登录Web服务器
  10. android触屏设备event模拟,android 使用命令模拟点击 滑动