美文网首页
JDK1.8-GC垃圾回收算法

JDK1.8-GC垃圾回收算法

作者: Wannay | 来源:发表于2021-03-18 23:35 被阅读0次
    • 次数上频繁收集Young区,次数上较少收集Old区,基本不动元空间。
    • GC和FGC的区别:
    • GC是指新生代的垃圾回收,GC很频繁,因为大多数的Java对象存活时间都很短,所以GC的回收速度很快、也很频繁。
    • FGC是指养老区(Old)的垃圾回收,GC回收速度不频繁,也不快,因为要扫描整个老年区的空间,所以它的速度比GC慢10倍左右。
    • GC的四大算法
    • 1.引用计数法
    • 2.复制算法(Copying)
    • 3.标记清除(Mark-Swap)
    • 4.标记压缩(Mark-Compact)

    1.引用计数法

    • JVM的实现一般不使用这种方法,应用在微软的COM/ActionScript3/Python...
    • 有被引用这个对象,计数器就+1,没有被引用的就被回收了
    • 缺点如下:
    • 1.每次对对象进行赋值的时候都要将计数器+1,且计数器本身也有消耗
    • 2.较难处理循环引用(A引用B,B引用A)
    System.gc();  //手动唤醒GC,禁用手动GC,JDK1.8的垃圾回收已经很智能了
    //不是立刻执行,也是要看系统的调度,类似创建了线程,也不是立刻执行,得看系统的调度
    

    只有main方法,后台有几个线程?两个,一个main,一个GC

    public class Main {
        public static void main(String[] args) {
    
        }
    }
    

    2.复制算法

    • 新生代(Young)中使用的GC就是使用的复制算法。
    -XX:MaxTenuringThreshold  //设置对象再新生代中存活代数,默认是15
    
    • 复制算法的基本思想是将内存分为两块,每次只用其中一块,这块内存用完,就将或者的对象复制到另外一块上去。复制算法不会产生内存碎片,但是耗空间
    • 从根集合(GC ROOT)开始,通过Tracing从FROM区找到存活对象,拷贝到TO区中;FROM区和TO区交换,下次内存分配继续从TO开始。

    3.标记清除算法

    • 思想是:先从内存中标记出来要回收的对象,然后进行统一回收。
    • 标记清除算法空间节约出来了,但是会产生内存碎片。而且要扫描两次,一次标记,一次清除,浪费了时间。

    4.标记压缩算法

    • 思想是:先从内存中标记出来要回收的对象,然后进行统一回收,之后对剩下来的存活的对象进行整理(丢在同一侧)
    • 缺点:效率不高,需要一定对象的成本,耗时比较严重。
    • 改进:标记-清除-压缩算法:标记清除和标记压缩算法的折中,进行多次的GC后才压缩。

    JVM的GC用的是哪种方法?

    新生代GC使用复制算法,在老年代FGC使用标记压缩、标记清除算法

    相关文章

      网友评论

          本文标题:JDK1.8-GC垃圾回收算法

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