1.背景 在上一节中,我们掌握了垃圾收集的一些算法,也弄明白了分代回收的原理, 那么HotSpot虚拟机是如何发起内存回收的? 2.如何找到GC Roots根节点(枚举根节点) 从可达性分析中GC Roots 节点找引用链这个操作为例,可作为GC Roots 的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的本地变量表)中,现在的很多应用仅仅方法区就有数百兆,如果要逐个检查这里面的引用,那么必然会消耗很多时间. 另外,可达性分析对执行时间的敏感还体现在GC停顿上,因为这项…
1.背景 在上一节中,我们掌握了垃圾收集的一些算法,也弄明白了分代回收的原理, 那么HotSpot虚拟机是如何发起内存回收的? 2.如何找到GC Roots根节点(枚举根节点) 从可达性分析中GC Roots 节点找引用链这个操作为例,可作为GC Roots 的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的本地变量表)中,现在的很多应用仅仅方法区就有数百兆,如果要逐个检查这里面的引用,那么必然会消耗很多时间. 另外,可达性分析对执行时间的敏感还体现在GC停顿上,因为这项…
对象的创建 java是一门面向对象的语言.在Java程序执行过程中无时无刻有Java对象被创建出来.在语言层面上,创建对象(克隆.反序列化)一般是一个newkeyword而已,而在虚拟机中,对象的创建步骤例如以下: 1.当虚拟机遇到new指令时.首先将去检查这个指令參数能否在常量池中定位到一个类的引用符号,而且检查这个符号引用代表的类是否被载入.解析和初始化过.假设没有.那必须先执行相应的类载入过程. 2.在类载入检查通过以后.接下来虚拟机将为新生对象分配内存.对象所需的内存大小在类载入后便确定…
前言 上篇文章介绍了Java虚拟机的运行时数据区域,大致明白了Java虚拟机内存模型的概况,下面就基于实用优先的原则,以最常用的虚拟机HotSpot和最常用的内存区域Java堆为例,升入探讨一下HotSpot虚拟机在Java堆中对象分配.布局和访问的全过程. 对象的创建 Java是一门面向对象的编程语言,在Java程序的运行过程中每时每刻都有对象被创建出来,那么在虚拟机中,对象的创建是怎样的一个过程呢? 当Java虚拟机遇到一条字节码new指令时,首先检查这个指令的参数是否能定位到一个类的符号引…
在HotSpot虚拟机中,对象在内存中存储的布局可以被分为3个区域:对象头(Header).实例数据(Instance data)和对齐填充(Padding).对象头包括两部分信息,第一部分存储自身的运行时数据,如哈希值.GC分代年龄.锁状态标志.线程持有的锁.偏向锁ID.偏向时间戳等,这部分数据的长度在32位和64位的虚拟机中(未开启压缩指针)分别为32bit和64bit,官方称它为 Mark Word. 存储内容 标志位 状态 对象哈希码.对象分代年龄 01 未锁定 指向锁记录的指针 00…
Sun的JVMGenerationalCollecting(垃圾回收)原理是这样的:把对象分为年青代(Young).年老代(Tenured).持久代(Perm),对不同生命周期的对象使用不同的算法.(基于对对象生命周期分析) 1.Young(年轻代) 年轻代分三个区.一个Eden区,两个Survivor区.大部分对象在Eden区中生成.当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这…
这是本人阅读周志明老师的<深入理解Java虚拟机>第二版抄写的,有很多省略,不适合直接阅读,需要阅读请出门左转淘宝,右转京东,支持周老师(侵权请联系删除) 第二章java内存区域与内存溢出异常 java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却像出来. 2.1概述 对于从事C\C++程序开发人员来说,内存管理领域,他们既是拥有最高权力的"皇帝"又是从事基础工作的"劳动人民"--即拥有…
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI",Tahoma,Helvetica,Sans-Serif,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5;}…
1.标记-清除算法 标记-清除(Mark-Sweep)算法是一种基础的收集算法. 1.算法思路 "标记-清除"算法,分为两个阶段: (A).标记 首先标记出所有需要回收的对象: 标记过程如<Java虚拟机垃圾回收(一) 基础>"2-4.判断对象生存还是死亡"中所述--分为两个标记过程(详细请参考前文): (1).第一次标记 在可达性分析后发现对象到GC Roots没有任何引用链相连时,被第一次标记: 并且进行一次筛选:此对象是否必要执行finalize(…
1. 对象的创建 1. 遇到 new 指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载.解析和初始化过.如果没有,执行相应的类加载. 2. 类加载检查通过之后,为新对象分配内存(内存大小在类加载完成后便可确认).在堆的空闲内存中划分一块区域(‘指针碰撞-内存规整’或‘空闲列表-内存交错’的分配方式). A.假设Java堆是规整的,所有用过的内存放在一边,空闲的内存放在另外一边,中间放着一个指针作为分界点的指示器.那分配内存只是把指针…