深入理解java虚拟机
阅读《深入理解java虚拟机》,写博客总结
小非肥
写博客的小傻瓜
展开
-
HotSpot的算法细节
读周志明老师《深入理解java虚拟机》笔记1.根节点枚举固定可作为GC roots的节点主要在全局性的引用,(例如常量或类静态属性)与执行上下文(例如栈帧中的本地变量表),查找需要耗费不少时间。所有收集器在根节点枚举这一步都必须暂停用户线程。类似标记整理算法。2.安全点在OopMap协助下,HotSpot可以快速准确地完成GCroot的枚举,但有问题,如果为每条指令都生成对应的Oop那会需要大量额外的存储空间。世界上HotSpot虚拟机没有为每条指令生成Oop他只为特定位置记录信息,这些位原创 2020-08-01 18:27:59 · 262 阅读 · 0 评论 -
垃圾收集算法
垃圾收集算法分代收集理论:弱分代假说:绝大多数对象都是朝生夕灭强分代假说:熬过越多次垃圾收集过程的对象就越难以消亡新生代的对象被老年代引用,整个遍历老年代很麻烦。跨带引用假说:跨代引用相对于同代应用来说,仅占极少数。在新生代中建立记忆集记录那些对象会被引用1.标记-清除算法:标记需要清除的对象,之后进行清理标记不需要清除的对象,清理未标记的对象缺点:执行效率不稳定,当需要清除的对象很多时,标记和清除的执行效率会随着需要清除对象的增加而降低。造成内存碎片化问题。空间碎片过原创 2020-07-19 17:08:35 · 62 阅读 · 0 评论 -
判断java对象是否已死
1. 如何判断那一个对象是否还存活引用计数算法在对象中添加一个引用计数器,每当有一个地方饮用它时,计数器的值就加一;当引用失效时,计数器值就减一;任何时候计数器为零的对象就是不可能在被引用 缺陷:无用的对象互相引用根可达算法根对象作为起始节点集,从这些节点开始,根据应用关系向下搜索,沿途的路径被称为引用链。如果每个对象到根节点没有任何引用链那说明这个对象无用。可作为根的对象:java虚拟机内部的引用方法区中类静态属性引用的对象方法区中常量引用的对象原创 2020-07-19 17:31:07 · 138 阅读 · 0 评论 -
对象的访问定位
读周志明老师《深入理解java虚拟机》笔记2.3.3对象的访问定位java程序会通过栈上的referance对象来操作堆上的具体对象《java虚拟机规范》之规定指向对象的引用,并未规定通过什么方式指向以及指向的具体位置。主流的访问方式:句柄,直接指针句柄使用句柄来访问的最大好处就是reference中存储的是稳定的句柄地址,在对象被移动时,只会改变对象的实例数据指针,而reference本身不需要修改。直接指针最大好处就是速度快,节省了一次指针定位的时间开销...原创 2020-07-28 09:04:17 · 108 阅读 · 0 评论 -
对象的内存布局
读周志明老师《深入理解java虚拟机》理解2.3.2.对象的内存布局对象在堆内存中的存储布局可以分为三个部分:对象头,实例数据,对齐填充对象头(Header MarkWord):第一部分用于存储对象自身的运行时数据,如哈希码(HashCode)、GC 分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳、对象分代年龄,这部分信息称为“Mark Word”;Mark Word 被设计成一个非固定的数据结构以便在极小的空间内存储尽量多的信息,它会根据自己的状态复用自己的存储空间。第原创 2020-07-27 09:12:09 · 67 阅读 · 0 评论 -
虚拟机对象的创建
读周志明老师《深入理解java虚拟机》笔记2.3.11.对象的创建当java虚拟机遇到一条字节码new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号应用代表的类是否被加载,解析和初始化。如果没有,那必须先进行类加载。在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需的内存大小在类加载后便可完全确定。为对象分配空间的任务世界上,便等同于把一块确定大小的内存块从java堆中划分出来。内存分配完成后,虚拟机将分配的内存空间都初始化为零原创 2020-07-26 21:15:53 · 132 阅读 · 0 评论