GC

1、谁是真正的垃圾。判断可触及性

image.png

2、JAVA采用可达性分析

  • 从GCRoots开始维护的有向图,进行搜索,如果一个对象没有直接或间接指向GCROOTS的引用,就是垃圾。注意对象不能是“可复活的”
  • GCRoots包括那些内容:Class、Thread、JNI、Stack...
  • 引用的强度,及其差别,soft:内存不足回收,因此不会导致oom。weak:发现就回收。
image.png
image.png

3、GC算法

image.png
  • 卡表(Card Table):为更快的回收新生代而生,通过卡表,有选择性的扫描老年代来发现引用,根本原因:新生代回收频繁,老年代频率较低
image.png

四、如何晋升老年代

  • 老年对象进入老年代:对象的年龄由对象经历的GC次数决定。默认为15,当然可以自己配置。
  • 大对象进入老年代:一个大对象,新生代的eden区或survior区都无法放的下,会直接晋升到老年代。
image.png
image.png

五、TLAB(Thread Local Allocation Buffer):是一个线程专用的内存分配区域。为加速对象分配而生。

  • 在多线程的情况下,可能会同时有多个线程(竞争)进行内存分配,因此需要保持同步,而同步又会导致效率下降。因此JVM使用TLAB来避免多线程冲突,提高了对象的分配的效率。占用一段eden空间。
  • TLAB的启用是否,对对象的分配的影响还是比较大的。

六、JVM内存分配策略:开启栈上对象内存分配。

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容