您的位置:首页 > 其它

对象引用算法、垃圾收集算法、内存分配策略

2017-03-12 22:21 393 查看
《深入理解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、空间分配担保
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: