《深入理解Java虚拟机:JVM高级特性与最佳实践》摘录
1、引用计数算法 给对象添加一个引用计数器,每当有一个地方引用时,计数器就加1,当引用失效时,计数器值就减1,计数器为0的对象就是不可能再被使用。JVM没有选用该算法,因无法解决相互循环引用问题。 2、根搜索算法 通过一系列的名为“GC Roots”的对象作为起点,向下搜索,搜索所经过的路径成为引用链,当一个对象到“GC Roots”没有任何引用链相连时,则证明此对象是不可用的 可作为GC Roots的对象有: 虚拟机栈中引用的对象 方法区中类静态属性引用的对象、常量引用的对象 本地方法栈中JNI引用对象 PS:4种引用,强引用、软引用、弱引用、虚引用,这四种引用强度以此减小 强引用(Strong Reference):类似Object o = new Object(),只要强引用在,就不会垃圾回收 软引用(Soft Reference):在将要发生内存溢出之前,会将软引用对象列进回收范围之内并进行第二次回收 弱引用(Week Reference):被弱引用对象只能发生到下次GC之前,当发生GC时,无论内存是否足够,都会被回收 虚引用(Phantom Reference):虚引用的存在完全不会对其生存时间构成印象,也无法通过需引用获取一个对象,设置虚引用的唯一目的就是被GC时收到一个通知
1、标记–清除算法 最基础的收集算法;缺点:一是效率问题,标记和清除过程效率都不高,二是空间问题,产生大量不连续碎片 2、复制算法 将内存划分为大小相等两块,每次只使用其中一块。优点:实现简单,效率高;缺点:以牺牲一半内存为代价 现在商用虚拟机都是采用这种算法来回收新生代(一块较大的Eden空间和两块较小的Survivor) 3、标记–整理算法 标记过程与标记清除算法一致,只不过后续步骤不是对可回收对象进行清除,而是让所有存活对象往一端移动,然后直接清理掉端边界以外的内存 4、分代收集 根据新生代与老年代的特点采用最适当的策略,新生代采用复制算法,老年代采用标记清除或者标记整理算法
1、对象优先在Eden分配 2、大对象直接进入老年代:大对象比如很长的字符串、数组 3、长期存活的对象进入老年代 4、动态对象年龄判定 5、空间分配担保