第三章:java内存分配与回收

1. 概览

具体对象的内存分配规则取决于垃圾收集器的组合,还有JVM内存相关的参数设定。本节讨论几种常见的内存分配与回收策略。

2. 对象优先在Eden分配

Eden区没有足够空间进行分配,将会进行一次Minor GC。Minor GC在新生代回收,发生在老年代的full GC一般比minor GC慢10倍

3. 大对象优先在老年代分配

要尽量避免朝生夕死的大对象。设置参数

-XX: PretenureSizeThreshold可以使得超过这个大小的直接在老年代分配,而且这个参数只对Serial和ParNew收集器有效。可以在ParNew+CMS场景试用。该参数单位是......

第三章:HotSpot算法实现分析

1. 枚举根节点

可达性分析对执行时间的敏感体现在GC停顿上,这项工作必须再一个能确保一致性的快照中进行。这里“一致性”指在整个分析期间整个系统看起来就像被冻结在某个时间点上,不可以出现分析过程中对象引用关系还在不断变化的情况。这导致GC进行必须停顿所有Java执行线程,这个称为“Stop The World”。当然执行系统停顿下来后,不需要一个不漏地检查完所有执行上下文和全局的引用位置,VM通过一组OopMap数据结构可以得知哪些地方存放着对象的引用,减少可达性分析代价。

2. 安全点(Safe Point)

为每一条指令都生成对应OopMap会占用额外空间,因此VM只在特定位......

第三章:引用与垃圾回收算法

1.如何确定对象存活

1.1 引用计数法

描述:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。

优点:实现简单,判定效率高

缺点:互相引用对方,导致引用计数器都不为0,于是引用计数器无法通知GC收集器回收他们;标记和清楚两个过程的效率不高;标记清楚之后会产生大量不连续的内存碎片。

1.2 可达性分析算法

在主流的商用程序语言(Java、C#,甚至包括前面提到的古老的Lisp)的主流实现中,都是称通过可达性分析(Reachability Analysis)来判定对象是否存活的。这......