GC-JVM垃圾回收机制

1、当对象dead:

一、引用计数法:给对象添加一个引用计数器,当有一个地方引用它时,计数器+1;当引用失效时,计数器-1。
任何状况下,计数器为0的对象,都是不可以使用的。算法

优势:简单,高效spa

缺点:循环引用对象

二、可达性分析算法:经过一系列的名为“GC Roots”的对象做为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到 GC Roots 没有任何引用链相连(用图论的话来讲就是从 GC Roots 到这个对象不可达)时,则证实此对象是不可用的。内存

特色:GC Roots→引用链虚拟机

三、引用:分为 强引用,软引用,弱引用,虚引用。效率

强引用:引用在,不回收搜索

软引用:SoftReference OOM前,把这些对象回收 若是仍OOM→抛出异常循环

弱引用:WeakReference 下一次GC则清除引用

虚引用: PhantomReference 回收时→系统通知程序

2、垃圾收集算法:

一、标记-清除:

标记全部要回收的对象 统一回收

缺点:效率问题 标记和清除的效率都不高 空间问题 大量不连续的内存碎片

二、复制

将可用内存的容量划分为大小相等的两块,每次只使用其中的一块。当这一块用完了,就将还存活的对象复制到另一块上面,而后再把已使用过的内存空间一次清理掉。
 缺点: 内存→1/2

优势:实现简单 运行高效

新生代: 1 Eden 2 Survivor

三、标记-整理:

标记过程仍然与“标记-清除”算法同样,但不是直接对可回收对象进行清理,而是让全部存活的对象向一端移动,而后直接清理掉边界之外的内存。

老年代 存活率高

四、分代收集

why 不一样对象,存活周期不一样 选择最适合的算法

新生代 大批对象死去、少许存活 复制

老年代 对象存活率高 标记-整理

 

ps:

一、新生代:主要存放的是哪些很快就会被GC回收掉的或者不是特别大的对象(这个大就要看你是否设置了-XX:PretenureSizeThreshold 参数了)。新生代采用的复制算法,即将新生代分为3个区:较大的Eden和两个较小的Survivor(默认的Eden:Survivor = 8:1)。发生在新生代的GC为Minor GC 。在Minor GC时会将新生代中还存活着的对象复制进一个Survivor中,而后对Eden和另外一个Survivor进行清理。因此,日常可用的新生代大小为Eden的大小+一个Survivor的大小。

二、老年代:老年代则是存放那些在程序中经历了好几回回收仍然还活着或者特别大的对象(这个大就要看你是否设置了-XX:PretenureSizeThreshold 参数了)。老年代采用的是标记-清除或者标记-整理算法,这两个算法主要看虚拟机采用的哪一个收集器,两种算法的区别是:标记-清除可能会产生大量连续的内存碎片。在老年代中的GC则为Major GC。Major GC和Full GC会形成stop-the-world。

三、那么什么状况下,新生代的对象会进入老年代呢?

首先就是分配担保机制:当Minor GC时,新生代存活的对象大于Survivor的大小时,这时一个Survivor装不下它们,那么它们就会进入老年代。

还有其余的状况:若是设置了-XX:PretenureSizeThreshold3M 那么大于3M的对象就会直接就进入老年代。

还有,在新生代的每一次Minor GC 都会给在新生代中的对象+1岁,默认到15岁时就会重新生代进入老年代,能够经过-XX:MaxTenuringThreshold来设置这个临界点。

相比较而言,在老年代中的对象比新生代中的对象不易回收许多。

相关文章
相关标签/搜索