美文网首页
jvm(4)-垃圾回收算法

jvm(4)-垃圾回收算法

作者: StayHungriest | 来源:发表于2020-03-12 18:23 被阅读0次

    一、垃圾回收概念及其算法

    Garbage Collection简称GC,GC中的垃圾特指内存中,不会再被使用的对象,而回收就是把‘垃圾’倒掉。GC有很多算法,如:引用计数法、标记压缩法、复制算法、分代、分区。

    1. Client和Server虚拟机工作模式

    client模式,相对server模式启动快,适合测试等,不适合长时间生产环境的运行。

    2. 引用计数法

    被引用计数器+1,引用失效-1,但循环引用可能会出问题。

    3. 标记清除法

    分为标记和清除两个阶段来进行垃圾回收。弊端是内存空间有碎片、不连续,导致效率降低。

    4. 复制算法

    空间分为两块,每次只使用一块,在回收时,将使用的内存复制到另外一个空间去,剩下的进行清理。

    5. 标记压缩法

    在标记法基础上,将标记的对象压缩到一端进行清除。

    6. 分代算法

    新生代使用复制,老年代使用标记压缩法。
    因为新生代频率高,老年代频率低,所以复制算法适合新生代。老年代GC耗时长,应减少老年代的GC。

    7. 分区算法

    内存分为n个小区间,每次GC时一次回收多少个分区,而不是对整个空间进行GC,减少GC对系统的介入的停顿。

    二、对象如何进入老年代

    1. 一般而言,没有GC介入,对象不会离开eden区。
    2. 对象到了一定年龄会自动进入老年代。
    2. 一次GC,没被回收,则年龄+1。
    3. 虚拟机提供一个参数来控制新生代对象的最大年龄。

    -XX:MaxTenuringThreshold:默认情况下为15

    4. 若eden区满了,则新对象直接进入老年代。
    5. 有参数设置,当一个对象大小超过设定时,直接进入老年代。

    -XX:PretenureSizeThreshold
    但是要注意TLAB区域优先分配空间。

    6. TLAB

    全称是Thread Local Allocation Buffer即线程本地分配缓存,为了加速对象分配,每个线程都有TLAB区域,该线程独享的工作区域,可以避免多线程冲突,提高对象分配效率 。tlab空间一般不大,当大对象无法在TLAB分配时,则会直接分配到堆上。
    相应参数
    -XX:-UseTLAB 禁用TLAB
    -XX:+TLABSize 设置大小
    -XX:TLABRefillWWasteFraction 设置进入TLAB空间的单个对象大小,是一个比例,默认64,如果对象大于整个空间1/64,则在堆创建对象。
    -XX;+PrintTLAB 查看TLAB信息
    -XX:ResizeTLAB 自调整TLABRefillWWasteFraction阈值大小
    -XX:-DoEscapeAnalysis 查看TLAB信息必须禁用

    相关文章

      网友评论

          本文标题:jvm(4)-垃圾回收算法

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