GC

作者: 远o_O | 来源:发表于2017-07-21 14:30 被阅读5次

    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

    相关文章

      网友评论

          本文标题:GC

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