[总结]-第三章 垃圾收集器与内存分配策略
1、知识点
一、对象是否存活的断定
断定对象死亡须要通过2次标记:java
- 第一次标记:可达性分析后没有与GC Roots相链接的引用链。
- 第二次标记:GC对F-Queue中的对象进行标记(低优先级的Finalizer线程会去执行F-Queue中对象的finalize()方法)
二、引用分类
- 强引用(Strong Reference)
- 主要强引用还在,则垃圾收集器不会回收被引用的对象。
- 软引用(Soft Reference)
- 弱引用(Weak Reference)
- 虚引用(Phantom Reference)
三、finalize( )
- 任何一个对象的finalize()方法都只会被系统自动调用一次。(注意是对象,并非类);
- finalize()若是耗时过长,GC并不会等待。它只是通知另外一个线程(Finalizer)去执行而已;
- 知道便可,不建议使用;
四、垃圾收集算法
- 引用计数器
- 优势:实时性,只要对象的引用计数器为0,马上回收;
- 缺点:互相引用就永远没法去除。
- 标记、清除(通常在老年代适用)
- 标记:找到全部可访问的对象,作个标记;
- 清除:遍历堆,把未标记的对象清除;
- 缺点:一、标记、清除效率都低;二、空间内存碎片;三、STW;
- 标记、整理(通常在老年代适用)
- 标记:找到全部可访问的对象,作个标记;
- 整理:将存活对象向一端移动,最后清除端边界之外的对象;
- 复制(通常在新生代适用)
- 优势:GC时,将存活的对象复制到另一半空间中,删除当前空间全部遗留对象便可。简单高效。
- 缺点:须要浪费一半空间。
- 衍生:Eden(1)+ Survivor(2),默认 Eden:Survivor:Survivor = 8:1:1。
- 分代收集
- 新生代使用复制算法;
- 年老代使用标记清除或标记整理算法。
五、安全点和安全区域
六、垃圾收集器
七、新生代GC与老年代GC
只要老年代的连续空间大于新生代对象总大小或者历次晋升的平均大小就会进行MinorGC,不然将进行FullGC。线程
八、进入老年代
-
大对象直接进入老年代对象
- -XX:PretenureSizeThreshold参数,比此值大的会直接在老年代分配。
- 目的是避免在Eden区及两个Survivor区之间发生大量的内存复制。
-
长期存活的对象进入老年代排序
- -XX:MaxTenuringThreshold默认15,每次MinorGC后,年龄+1。
-
动态对象年龄
- 若是在Survivor空间中相同年龄全部对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就直接进入老年代。
博客
https://my.oschina.net/gmarshal
欢迎关注个人我的微信订阅号:(听说这个头像程序猿专用)
