3. JVM GC算法及具体垃圾收集器( 四 )


3.6.
目标:任何内存大小下都只有10ms停顿
G1后继者,G1借助实现多线程Full GC
摒弃了在G1中耗费大量内存和计算资源去维护的记忆集,改用名为“连接矩阵”( )的全局数据结构来记录跨的引用关系,降低了处理跨代指针时的记忆集维护消耗,也降低了伪共享问题(见3.4.4节)的发生概率
工作流程
若访问过期对象通过保护陷阱自动转发对象引用
提出的新方案不需要用到内存保护陷阱,而是在原有对象布局结构的最前面统一增加一个新的引用字段,在正常不处于并发移动的情况下,该引用指向对象自己
使用CAS解决对象移动与对象变化产生的并发问题
对象访问通过内存屏障解决并发问题,读屏障比写屏障多 使用读屏障,后改为引用访问屏障降低原生操作的影响
3.6.2 ZGC
ZGC收集器是一款基于内存布局的,(暂时)不设分代的,使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记-整理算法的,以低延迟为首要目标的一款垃圾收集器 。
基于G1 使用分代,使用读屏障 三色标记,brook
ZGC的具有动态性,容量分为小(256KB)、中(4MB)、大(4MB以上) 。复制大对象代价昂贵
并发整理
染色指针三大优势
运行过程
3.7选择合适的垃圾收集器 3.7.1 收集器的权衡3.8实战:内存分配与回收策略
Java技术体系的自动内存管理,最根本的目标是自动化地解决两个问题:自动给对象分配内存以及自动回收分配给对象的内存 。
3.8.1对象优先在eden分配
对象优先在eden分配,空间不够引发minor gc,若设置了ld 则超过指定大小的对象直接进入老年代
通过-XX:设置存活多少次可以进入老年代
3.8.2动态对象年龄判定
为了能更好地适应不同程序的内存状况,虚拟机并不是永远要求对象的年龄必须达到-XX:才能晋升老年代,如果在空间中相同年龄所有对象大小的总和大于空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到-XX:中要求的年龄 。
3.8.3 空间分配担保
在发生Minor GC之前,虚拟机必须先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果这个条件成立,那这一次Minor GC可以确保是安全的 。
GC是否安全取决于老年代是否有足够的连续空间分配新生代要晋升的对象
3.9 本章小结
本章介绍了垃圾收集的算法、若干款虚拟机中提供的垃圾收集器的特点以及运作原理 。通过代码实例验证了Java虚拟机中自动内存分配及回收的主要规则 。
垃圾收集算法
虚拟机中提供的垃圾收集器的特点以及运作原理
【3. JVM GC算法及具体垃圾收集器】