jvm垃圾回收机制

jvm垃圾回收机制

注意与一般指的虚拟机都是指HotSpot虚拟机

堆空间的基本结构

  • java的自动内存管理主要是针对对象内存的回收对象内存的分配,同时java自动内存管理最核心的功能是对内存中的对象的分配与回收
  • java对是垃圾收集器管理的主要区域,音痴也被乘坐GC堆
  • 从垃圾回收的角度莱索,由于现在收集器基本都才用分代垃圾回收算法,所以java对呗或分为了几个不同的区域,这样我们就可以根据各个区域的特点选择合适的垃圾收集算法
  • jdk7与以前的版本,堆内存被通常分为下面单个部分,
    • 新生代内存 又分为三个部分 eden s0 s1
    • 老生代
    • 永久代 java8后被元空间代替 同时元空间使用直接内存

内存分配与回收原则

  • 对象优先在Eden区分配,只有在Eden空间已经被分配满了的话,才会将新生代的对象提前转义到老生代中,进行空间分配担保
  • 大对象直接进入老生代比如字符串数组等
  • 长期存活的对象将进入老生代

死亡对象判断方法

  • 引用计数法给对象中添加一个引用计数器:
    • 每当有一个地方引用它,计数器就加 1;
    • 当引用失效,计数器就减 1;
    • 任何时候计数器为 0 的对象就是不可能再被使用的。
    • 优点实现简单,效率高,但是目前主流的虚拟集中没有悬着这个算法来管理内存器最主要的原因是他很难接对象之间项目循环引用的问题
  • 可达性分析算法这个算法的基本思想就是通过一系列的称为 “GC Roots” 的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连的话,则证明此对象是不可用的,需要被回收。只要到GC’之间不可达就会被额认为是需要被回收的对象

垃圾收集算法

  • 标记清除算法标记出所有不需要回收的对象,在标记完成后统一回收所有没有被标记的对象,
    • 效率慢
    • 空间问题 标记清楚后会产生大量连续的碎片
  • 标记复制算法“标记-复制”收集算法出现了。它可以将内存分为大小相同的两块,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收。
  • 标记整理算法将根据老年代的特点踢出的一众标记算法,标记过程仍然与标记清楚算法一样,但是后续步骤表示直接对可回收对象进行回收而是让所有存活的对象向一段移动,然后直接清理掉段边界以外的内存
  • 分代收计算法根据不同年代的特点选择合适的垃圾收集算法,比如在新生代使用标记复制算法,老年代存活率高使用标记清除或者标记整理算法

垃圾收集器

  • Serial收集器 单线程,新生代采用标记复制算法,老年代使用标记整理算法,还有其old版本
  • parnew收集器, Serial采用多线程的版本
  • paralel Scavenge收集器 jdk1.8默认的收集器,同样新生代采用标记-复制算法,老年代采用标记-整理算法。注重用户体验,但是没有cms用户体验好,同样有其旧版本
  • CMS 收集器 CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。它非常符合在注重用户体验的应用上使用。CMS(Concurrent Mark Sweep)收集器是 HotSpot 虚拟机第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程(基本上)同时工作。
  • G1收集器 G1 (Garbage-First) 是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足 GC 停顿时间要求的同时,还具备高吞吐量性能特征.
  • ZGC 与 CMS 中的 ParNew 和 G1 类似,ZGC 也采用标记-复制算法,不过 ZGC 对该算法做了重大改进。

版权声明:本文为reresrse原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。