垃圾回收

HotSpot中的“世代/分代”(Generations)概念 for Java 10

Java的优势之一是它对开发者屏蔽了复杂的内存分配和垃圾回收,但当垃圾回收成为瓶颈时,了解它的内部实现机制是有必要的。

当运行时没有任何指针指向一个对象时,那这个对象就是个“垃圾”。最直截了当的垃圾收集算法遍历所有“可达”对象,剩下所有的对象都视为“垃圾”😀。这种算法的时间消耗跟“存活”的对象数量成正比,对于持有大量“存活”对象的大型程序禁止这么干。

采用分代收集的虚拟机整合了不同的垃圾回收算法。不成熟的垃圾收集器检测堆中每个存活的对象,而分代收集则观测根据程序运行经验以最少的工作完成垃圾回收。最重要的观测属性是“weak generational hypothesis”(弱世代假设),这种状态的大多数对象都存活很短的时间。

下图中的蓝色区域是对象常规的寿命分布。X轴是以字节为单位的对象寿命,Y轴的字节数量是相应生存期的对象的总字节数。左边的断崖表示对象在创建之后很快被回收(即对象已“死”)。例如Iterator,通常指存活一次迭代。

对象寿命
阅读更多