HotSpot虚拟机垃圾收集优化指南

并行收集器

并行收集器也称作吞吐量优先收集器,是一种跟串行收集器类似的分代/世代收集器。跟串行收集器不同的是,并行收集器使用多线程的方式来加速垃圾回收。

使用-XX:+UseParallelGC参数开启并行收集器。默认情况下,使用此参数后,minor收集和major收集都会采用并行的方式,进一步较少垃圾回收的负载。

并行垃圾收集器的线程数量

在具有N(N大于8)个物理线程的机器上,串行收集器使用N的分数作为垃圾回收线程数量。

比例大约为5/8 * N。如果N小于8,则使用N作为线程数。在有些平台上,这个数值为5/16*N。此数值也可以通过命令行参数指定。在单处理器的机器上,并行收集器的表现可能不如Serial收集器,因为并行收集器有较高的开销,例如同步。当应用程序运行在配置了中大型堆内存的虚拟机上时,在双核环境下,并行收集略好与串行收集。在更多核的机器上,并行收集的性能优势更为显著。

阅读更多

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,通常指存活一次迭代。

对象寿命
阅读更多