堆中是分块的,即以块为单位。当块用完的时候,用“标记-清扫”方式回收垃圾。而当块碎片较多时,转用“暂停-拷贝”方式回收垃圾
1.“标记-清扫”:
标记清扫算法是目前商用JVM中垃圾回收期的实现基础
标记: 将根集合中的一个对象添加到队列中 遍历队列中的对象,对每个对象X: 将X标记为可达的 将X所持有的引用添加到队列中 清理: 遍历堆中每个对象X: 如果X没有被标记为可达的,就回收之
通过前面对算法和引用跟踪技术的介绍,可以知道标记-清理算法的计算复杂度是以堆中存活对象和堆的实际大小为自变量的函数
2.“暂停-拷贝”:
暂停-拷贝是一种特殊的引用跟踪垃圾回收技术,其运行方式简单有效,但对于现实生产环境中普遍使用的大内存容量来说,有些不切实际。
使用暂停-拷贝算法需要将堆划分成两个同样大小的分区,而在应用程序运行时只能使用其中一个分区,这样才能保证有足够大的空间来存储从垃圾回收中存活下来的对象,但这种方式实在太浪费内存。该算法的最简实现是从根集合的对象开始遍历正在使用的分区中的全部存活对象,将标记为 存活的(live)的对象拷贝至另一个未使用的分区。在垃圾回收结束后,交换两个分区的角色,等待下次垃圾回收开始。