美文网首页
GC垃圾回收

GC垃圾回收

作者: 五月天_7df7 | 来源:发表于2018-11-07 13:32 被阅读0次

    GC是在什么时候,对什么东西,做了什么事情?

    .系统自身决定,不可预测的时间/调用System.gc()的时候。 eden满了minor gc,升到老年代的对象大于老年代剩余空间full gc,或者小于时被HandlePromotionFailure参数强制full gc

    对从gc root开始搜索,搜索不到的对象。 

    .能说出诸如新生代做的是复制清理、from survivor、to survivor是干啥用的、老年代做的是标记清理、标记清理后碎片要不要整理、复制清理和标记清理有有什么优劣势等。 

    第一种:标记清除

    它是最基础的收集算法。

    原理:分为标记和清除两个阶段:首先标记出所有的需要回收的对象,在标记完成以后统一回收所有被标记的对象。

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

    地方 :适合在老年代进行垃圾回收,比如CMS收集器就是采用该算法进行回收的。

    第二种:标记整理

    原理:分为标记和整理两个阶段:首先标记出所有需要回收的对象,让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。

    特点:不会产生空间碎片,但是整理会花一定的时间。

    地方:适合老年代进行垃圾收集,parallel Old(针对parallel scanvange gc的) gc和Serial old收集器就是采用该算法进行回收的。

    第三种:复制算法

    原理:它先将可用的内存按容量划分为大小相同的两块,每次只是用其中的一块。当这块内存用完了,就将还存活着的对象复制到另一块上面,然后把已经使用过的内存空间一次清理掉。

    特点:没有内存碎片,只要移动堆顶指针,按顺序分配内存即可。代价是将内存缩小位原来的一半。

    地方:适合新生代区进行垃圾回收。serial new,parallel new和parallel scanvage

    收集器,就是采用该算法进行回收的。

    复制算法改进思路:由于新生代都是朝生夕死的,所以不需要1:1划分内存空间,可以将内存划分为一块较大的Eden和两块较小的Suvivor空间。每次使用Eden和其中一块Survivor。当回收的时候,将Eden和Survivor中还活着的对象一次性地复制到另一块Survivor空间上,最后清理掉Eden和刚才使用过的Suevivor空间。其中Eden和Suevivor的大小比例是8:1。缺点是需要老年代进行分配担保,如果第二块的Survovor空间不够的时候,需要对老年代进行垃圾回收,然后存储新生代的对象,这些新生代当然会直接进入来老年代。

    优化收集方法的思路

    分代收集算法

    原理:根据对象存活的周期的不同将内存划分为几块,然后再选择合适的收集算法。

    一般是把java堆分成新生代和老年代,这样就可以根据各个年待的特点采用最适合的收集算法。在新生代中,每次垃圾收集都会有大量的对象死去,只有少量存活,所以选用复制算法。老年代因为对象存活率高,没有额外空间对他进行分配担保,所以一般采用标记整理或者标记清除算法进行回收。

    相关文章

      网友评论

          本文标题:GC垃圾回收

          本文链接:https://www.haomeiwen.com/subject/fifttqtx.html