JVM:垃圾收集器与内存分配策略(下)

2019-01-28  本文已影响0人  renyjenny

HotSpot算法实现

枚举根节点:从GC Roots节点中找出引用链的操作。
GC Roots对象主要在全局性引用(常量/类静态属性)与执行上下文(栈帧中的本地变量表)中,虚拟机不会逐个检查这些地方,HotSpot使用OopMap数据结构来记录。当类加载完成时,OopMap中就记录下对象内为引用的位置,和栈、寄存器中引用的位置。当GC扫描时就可以直接得知引用信息。

GC Roots.jpg

Stop The World:在可达性分析期间,需要这期间的一致性——不能一边分析,对象的引用关系还一直变化,所以GC时必须停顿所有的Java执行线程。

安全点:为了避免对每条指令都生成OopMap,而选择的记录信息的特定的位置。只有在安全点,程序才会停下来GC。安全点的选定标准:是否具有让程序长时间执行的特征,例如,方法调用、循环跳转、异常跳转。
让所有线程都到最近的安全点再停顿的方法:

安全区域:针对不执行的线程(sleep或blocked状态)设置。当线程进入安全区时,就标识自己,GC时就不用管这些线程。当线程要离开安全区时,要先检查系统是否完成根节点枚举(或GC),要完成了才能安全离开安全区。

安全区.jpg

垃圾收集器

HotSpot的垃圾收集器.jpg

新生代垃圾收集器

image.png

老年代垃圾收集器

image.png

CMS收集器(Concurrent Mark Sweep)

  1. 初始标记(CMS initial mark)
    STOP THE WORLD,标记GC Roots能直接关联的对象,速度最快
  2. 并发标记(CMS concurrent mark)
    进行GC Roots Tracing
  3. 重新标记(CMS remark)
    STOP THE WORLD,修正在并发标记期间有变动的对象标记记录
  4. 并发清除(CMS concurrent sweep)
    回收对象

缺点

G1收集器(Garbage-first)

适用于服务器端。
优点:

  1. 初始标记
  2. 并发标记
  3. 最终标记
    STOP THE WORLD,可并发执行最终标记。修正并发标记期间有变动的对象记录,虚拟机将这些变化记录在线程Remembered Set Logs里面,再合并到Remembered Set中。
  4. 筛选回收
    STOP THE WORLD,可并发执行。对各个Region的回收价值和成本进行排序,根据用户的需求来指定回收计划。

GC日志

// 参数:-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
[GC (Allocation Failure) [PSYoungGen: 7128K->616K(9216K)] 7128K->6768K(19456K), 0.0057651 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[Full GC (Ergonomics) [PSYoungGen: 616K->0K(9216K)] [ParOldGen: 6152K->6658K(10240K)] 6768K->6658K(19456K), [Metaspace: 2542K->2542K(1056768K)], 0.0066751 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 

内存分配与回收策略

上一篇 下一篇

猜你喜欢

热点阅读