HotSpot

HotSpot中的垃圾收集器

Java HotSpot虚拟机包含了三类垃圾收集器,每一类都有不同的性能特征。

串行(Serial)收集器

串行收集器在单线程中进行垃圾回收,由于没有线程之间的切换,因此垃圾回收工作相对较高效。

对单核处理器的硬件来说,串行收集器是最佳选择。因为它无法发回多核设备的优势。只适合小型应用程序。

Serial收集器在某些设备和操作系统上是默认配置,当然你也可以可以使用

-XX:+UseSerialGC

参数手动指定HotSpot虚拟机使用串行收集器。

并行(Parallel)收集器

parallel收集器也被称为 throughput collector(吞吐量优先)收集器,它与Serial收集器的主要区别在于,垃圾回收过程在多线程中进行,加速了垃圾回收过程。parallel收集器一般用于运行在多核、多线程设备上的中大型应用程序。

可以通过

-XX:+UseParallelGC

启用parallel收集器。

阅读更多

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

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

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

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

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

对象寿命
阅读更多