美文网首页
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