JVM--垃圾回收机制

jvm垃圾回收

堆分为新生代、老年代,方法区在jdk1.7以及之前也被成为永久代(PermGen space)

任何对象一生只会调用一次finalize()方法,在此方法内,如果又被引用,则可以存活

如何判断对象是否已经死去,可以回收?

计数法(最古老)

计数法针对循环引用没用

GcRoots方法 可达性分析算法

通过判断每个引用到GcRoots根节点的可达性来判断是否回收该引用

垃圾收集算法有哪些?

标记-清除算法

应用于老年代

会产生内存碎片

复制算法

应用于新生代,小,gc操作频繁,快

新生代又分为 eden区与survivor区(一般有2个)默认比例为8:1,eden区大

将要回收的内存从eden区与其中一个survivor赋值到另外一个survivor区中,如果不够大,则可能需要老年代进行分配担保,如果老年代也装不下,则报内存溢出错误

标记-整理算法

应用于老年代

与标记-清除算法不同的是,将内存块标记,回收后,会有一个存活内存的整理过程,则从一端移动到另一端

垃圾回收器有哪些?

Serial收集器(最古老)

单线程(回收线程与用户现场不并行)

stop the world

ParNew收集器

serial的多线程实现方式

新生代

Parallel Scavenge收集器

新生代

针对提高吞吐量设计,提高cpu资源利用率

标记-整理算法

Parallel Old收集器

Parallel Scavenge收集器的老年代版本

标记-整理算法

CMS收集器concurrent mark sweep

基于标记-清除算法

第一次标记-》并发标记(与用户线程并发)-》重新标记-》并行清除(与用户线程并发)

G1收集器(garbage first)

G1收集器是一款面向服务端应用的垃圾收集器。HotSpot团队赋予它的使命是在未来替换掉JDK1.5中发布的CMS收集器。与其他GC收集器相比,G1具备如下特点:

  1. 并行与并发:G1能更充分的利用CPU,多核环境下的硬件优势来缩短stop the world的停顿时间。
  2. 分代收集:和其他收集器一样,分代的概念在G1中依然存在,不过G1不需要其他的垃圾回收器的配合就可以独自管理整个GC堆。
  3. 空间整合:G1收集器有利于程序长时间运行,分配大对象时不会无法得到连续的空间而提前触发一次GC。
  4. 可预测的非停顿:这是G1相对于CMS的另一大优势,降低停顿时间是G1和CMS共同的关注点,能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒。

在使用G1收集器时,Java堆的内存布局和其他收集器有很大的差别,它将这个Java堆分为多个大小相等的独立区域,虽然还保留新生代和老年代的概念,但是新生代和老年代不再是物理隔离的了,它们都是一部分Region(不需要连续)的集合。

虽然G1看起来有很多优点,实际上CMS还是主流。