一、垃圾回收概念及其算法
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信息必须禁用