1、谁是真正的垃圾。判断可触及性
image.png2、JAVA采用可达性分析
- 从GCRoots开始维护的有向图,进行搜索,如果一个对象没有直接或间接指向GCROOTS的引用,就是垃圾。注意对象不能是“可复活的”。
- GCRoots包括那些内容:Class、Thread、JNI、Stack...
- 引用的强度,及其差别,soft:内存不足回收,因此不会导致oom。weak:发现就回收。
3、GC算法
image.png- 卡表(Card Table):为更快的回收新生代而生,通过卡表,有选择性的扫描老年代来发现引用,根本原因:新生代回收频繁,老年代频率较低
四、如何晋升老年代
- 老年对象进入老年代:对象的年龄由对象经历的GC次数决定。默认为15,当然可以自己配置。
- 大对象进入老年代:一个大对象,新生代的eden区或survior区都无法放的下,会直接晋升到老年代。
五、TLAB(Thread Local Allocation Buffer):是一个线程专用的内存分配区域。为加速对象分配而生。
- 在多线程的情况下,可能会同时有多个线程(竞争)进行内存分配,因此需要保持同步,而同步又会导致效率下降。因此JVM使用TLAB来避免多线程冲突,提高了对象的分配的效率。占用一段eden空间。
- TLAB的启用是否,对对象的分配的影响还是比较大的。
网友评论