5.3 精确性
Java HotSpot垃圾回收器是一种全精确回收器, 与之形成对比的是, 许多垃圾回收器都是保守的(conservative)或半精确的(partially-accurate)。虽然保守的垃圾回收由于易于增加到一个不支持垃圾回收的系统中, 因而具有一定的吸引力, 但它却有一定的缺陷。
一个保守的垃圾回收器不能确切地断定所有对象的引用的分布位置, 其结果是, 它必须保守地假设那些看似要引用一个对象的内存字(memory Word)是事实上的对象引用。这就意味着它可能导致某种错误, 例如将一个整数误认为是一个对象指针; 这会造成一些负面影响。首先, 当发生这样的错误时(实际并不普遍), 内存泄漏会不可预知地以一种对应用程序员来说实质上不可再生(reprodUCe)或调试(debug)的方式出现(尽管由虚悬(dangling)对象引用所引起的崩溃仍可被预防, 并且如果有足够的备份内存, 该程序仍可正确执行);第二, 由于它可能已经导致了某个错误, 因而一个保守的回收器必须使用句柄来间接引用对象(降低性能), 或者避免重新定位对象;因为重新定位无句柄对象需要更新所有对对象的引用, 这在回收器不能确切地断定一个表面上的引用就是一个真的引用时, 是不可能做到的。不能重新定位对象将会导致对象内存碎片, 且更重要的是, 它会妨碍使用以下描述的先进的相继复制回收算法。
因为Java HotSpot回收器是全精确的, 因而它可以提供几个有力的设计保证, 这在保守的回收器上是不可能提供的: · 所有不可访问的对象内存都可以被可靠地回收;
· 所有对象都可以被重新定位, 因而可对对象内存的进行整理;这就消除了对象内存的碎片并增加了内存的本地性。
5.4 相继的复制回收
Java HotSpot性能引擎采用了具有先进技术的相继复制回收器,它有两个主要优点:
· 与Java 2 SDK相比,为大部分程序较大地提高了分配速度和总的垃圾回收效率(通常提高了5倍);
· 相应地减小了用户可感觉的垃圾回收时的"暂停"所出现的频率。
相继回收器利用了在大部分程序中大多数对象(通常为95%)都是非常短命的也就是被用作临时数据结构这样一个事实,通过将新创建的对象隔离到一个对象"幼稚园(nursery)"中,一个相继回收器可以完成以下几件事:第一,因为在对象幼稚园中,新的对象就象堆栈那样被一个接一个地分配,因而分配变得特别的快,因为这样它仅涉及单个指针的更新及对幼稚园溢出的单个检查。第二,到幼稚园溢出时,大部分幼稚园中的对象已经"死了",这就使垃圾回收器可以只简单地将幼稚园中极少数存活的对象移到别处就可以了,从而不必对幼稚园中死去的对象做回收工作。
5.5 采用标记-整理算法的"旧对象"回收器
尽管相继的复制回收器可以有效地回收大部分死的对象,但较长寿命的对象仍然在"旧对象"内存区不断地堆积。从内存不足状态或程序要求的角度考虑,有时必须执行对旧对象的垃圾回收。JavaHotSpot性能引擎可以使用一种标准的标记-整理回收算法,它从"根"开始遍历活对象的全部图解,然后扫描内存并整理回收由死的对象遗留的缝隙。通过整理回收堆中的缝隙(而不是将它们回收到一个释放清单中),可消除内存碎片;由于消除了释放清单搜索,则旧对象的分配将是更合理的。
Java HotSpot性能引擎的体系结构(5)
最新推荐文章于 2024-09-10 10:21:38 发布