您现在的位置:首页 > 教案模板 > 正文

tenured Ron.Zheng(郑云红)(2)

2017-12-25 01:05 网络整理 教案网

并行标记和清除(Parallel Mark and Sweep)

经过一定次数的回收之后,幸存下来的对象进入了老年代空间(tenured space)。它们幸存的次数称为“tenuring threshold(老年代阈值,也称提升阈值)”,老年代空间的回收工作和eden空间的回收工作有一些不同,它所使用的是一个被称为标记和清除的算法(mark and sweep)。每个对象都有一个与之相关联的标记位。这些标记初始值都被设置为false,在对对象图进行检索时,如果对象可达,那可达对象的标记就会被设置成true。

识别可达对象的图检索与我们上文对新生代(young generation)的检索描述类似。不同点在于使用标记取代了可达对象的拷贝。标记完成之后就可以遍历对象表并释放不可达对象所占用的空间。这个过程通过多线程并行完成,每个线程检索堆中的一个区。

不幸的是这一删除不可达对象的过程会让老年代空间(tenured space)看起来像瑞士奶酪(Swiss Cheese)。你得到了一些可以存储对象的使用过的内存,并且这些内存空间和过去的一些可达对象所使用的内存空间之间形成了空隙。这种内存碎片对于应用程序的执行效率来说是非常不利的,因为这让在这些空洞的内存空间中分配比它大的对象变得不可能。

tenured 内存_jvn tenured perm_tenured

这里写图片描述

Cheese after Mark and Sweep.

为了减少类似于瑞士奶酪(Swiss Cheese)这样的问题,并行标记/清除(Parallel Mark/Sweep)压缩了堆以便在老年代空间(tenured space)的开头分配连续可达的对象。对象删除之后检索老年代空间(tenured space)的区域以确定那些区域占有率低,那些区域占有率高。占有率低的区域中的可达对象会被移动到占有率高的区域。这些操作自然是在上一个压缩阶段的内存的底端,在这个阶段对象的移动实际上是通过分配给目标区域的线程去执行,而不是源区域( source region)。tenured

这里写图片描述

Low occupancy cheese.

小结

并行回收将堆分为四个空间:eden, 两个幸存者空间(survivor spaces)、老年代空间(tenured space)。

并行回收使用了并行、拷贝收集器回收Eden和幸存者空间(survivor spaces)。

在老年代空间(tenured space)使用了不同的算法。该算法标记了所有的对象,删除不可达对象然后压缩空间。

并行回收拥有良好的吞吐量,但是当其运行时会暂停整个应用。