JVM怎么判断对象可以回收了?

1,对象没有引用
2,作用域发生未捕获异常
3,程序在作用域正常执行完毕
4,程序执行了System.exit()
5,程序发生意外终止(被杀进程等)

JVM怎么定位是否为垃圾?

两种算法:引用计数法、可达性算法

  1. 引用计数算法:实际上是通过在对象头中分配一个空间来保存该对象被引用的次数。如果该对象被其它对象引用,则它的引用计数加一,如果删除对该对象的引用,那么它的引用计数就减一,当该对象的引用计数为0时,那么该对象就会被回收。

存在缺点
出现循环引用问题。

  1. 可达性算法:从GC Root作为起点开始搜索,那么整个连通图中对象都是活的,对于GC Root无法达到的对象便是垃圾对象,随时可被GC回收.

JVM怎么清除垃圾?

四种算法:标记清除算法复制算法标记整理算法分代收集算法
JVM使用的是:分代收集算法
3. 标记清除算法:“标记-清除”算法是最基础的算法,分为标记和清除两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。

存在缺点
效率问题:标记和清除过程的效率都不高。
空间问题:标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

  1. 复制算法:为了解决标记清除算法内存碎片化严重的缺陷,提出了复制算法,复制算法主要思想是,按内存容量将内存划分为大小相等的两块区域。每次只使用其中一块,当这一块内存满后将其中存活的对象复制到另一块上去,然后把该内存中的垃圾对象清理掉。

存在缺点
复制算法虽然实现简单,内存效率高,不易产生碎片,但是最大的问题是可用内存被压缩到了原本的一半。且存活对象增多的话,Copying 算法的效率会大大降低。

  1. 标记整理算法:结合了以上两个算法,为了避免缺陷而提出。标记阶段和标记清理算法相同,标记后不是清理对象,而是将存活对象移向内存的一端。然后清除端边界外的对象。

  2. 分代收集算法:在结合以上三种算法的综合分析及 JVM 内存对象生命周期的特点,诞生了一种新的垃圾回收算法——分代收集算法。其核心思想是根据对象存活的不同生命周期将内存划分为不同的域,一般情况下将 GC 堆划分为老年代(Tenured/Old Generation)和新生代(Young Generation)。老年代的特点是每次垃圾回收时只有少量对象需要被回收,新生代的特点是每次垃圾回收时都有大量垃圾需要被回收,因此可以根据不同区域选择不同的算法。
    新生代——复制算法:因为新生代中每次垃圾回收都要回收大部分对象,即要复制的操作比较少,但通常并不是按照 1:1 来划分新生代。一般将新生代划分为一块较大的 Eden 空间和两个较小的 Survivor 空间(From Space/S1, To Space/S2),每次使用 Eden 空间和其中的一块 Survivor 空间,当进行回收时,将该两块空间中还存活的对象复制到另一块 Survivor 空间中.
    老年代——标记复制算法:

    1. 对象的内存分配主要在新生代的 Eden Space 和 Survivor Space 的 From Space(Survivor目前存放对象的那一块),少数情况会直接分配到老年代;
    2. 当新生代的 Eden Space 和 From Space 空间不足时就会发生一次 GC,进行 GC 后,EdenSpace 和 From Space 区的存活对象会被挪到 To Space,然后将 Eden Space 和 FromSpace 进行清理;
    3. 如果 To Space 无法足够存储某个对象,则将这个对象存储到老年代;
    4. 在进行 GC 后,使用的便是 Eden Space 和 To Space 了,如此反复循环;
    5. 当对象在 Survivor 区躲过一次 GC 后,其年龄就会 +1。默认情况下年龄到达 15 的对象会被移到老年代中;

GC常用算法、常见垃圾收集器

JVM垃圾回收器类型

3组分别是:Serial和Serial Old、PS和PO、ParNew和CMS
GC常用算法、常见垃圾收集器
STW:暂时停下来等线程清理结束再继续。

Serial和Serial Old运行模式:暂时停下来等单线程清理结束再继续,会出现卡顿现象。

PS和PO运行模式:暂时停下来等多线程清理结束再继续,会出现卡顿现象。

jdk1.7/1.8 默认垃圾回收器PS和PO组合,如何查询垃圾回收器的类型:

  1. Window下命令:java -XX:+PrintCommandLineFlags -version
  2. 虚拟机(Centos)下:需要使用工具或者根据日志分析*;

什么是CMS?

CMS全名:concurrent mark sweep,它出现的意义在于解决STW卡顿现象,ParNew是专门设计出来跟CMS配合,ParNew约等于PS,但是唯一区别就是对针对PS做了增强模块。

CMS工作的几个阶段:

  1. initial mark(初始标记) 停顿时间:约200ms ;作出比较:G1:约10ms、ZGC:约1ms
  2. concurrent mark(并发标记)
  3. remark(重新标记)
  4. concurrent sweep(并发清理) 再出现垃圾:浮动垃圾

存在缺点
内存的碎片化;如果出现对象从年轻代转化老年代执行失败,会再次执行Serial Old进行碎片整理,如果产生浮动垃圾只能等下一次GC回收处理。

相关文章: