【Java 8 GC 调优】并行GC

本文介绍了Java 8中并行GC(吞吐量GC)的工作原理,包括如何启用、GC线程数的自动调整以及如何通过命令行选项进行配置。讨论了并行GC的目标,如最短暂停时间、吞吐量和内存占用,并提供了关于如何调整堆大小和“代”大小的建议,以优化性能和减少碎片。同时,文章提到了默认堆大小的计算方法以及如何避免长时间GC和OutOfMemoryError的问题。
摘要由CSDN通过智能技术生成

并行GC,也称为 吞吐量GC,是与 串行GC 类似的 分代GC。其主要区别在于,用多个线程加快垃圾收集速度。

可通过命令行选项 -XX:+UseParallelGC 启用 并行GC。默认情况下,使用此选项后,Minor 和 Major GC 都是并行执行,以进一步减少垃圾收集的开销。

在具有超过8个硬件线程的机器上,并行GC 会使用固定占比的数量作为GC线程数。

硬件线程数较大时,该占比为 5/8 。硬件线程数小于8时,GC线程数就是硬件线程数。在特定的平台上,该占比会降到 5/16 。可通过命令行选项指定 GC 线程数(稍后介绍)。

在单处理器机器上,因为并行执行(如,同步)的开销,并行GC 的表现不如 串行GC。

但对于中大型堆的应用程序来说,当运行在双处理器机器上时,并行GC 的性能通常会比 串行GC 稍好一些。有2个以上处理器时,并行GC 的表现会更好。

GC 线程数量 可通过命令行选项 -XX:ParallelGCThreads=<N> 来控制。

在已通过命令行显式设置堆大小的情况下,堆大小对良好性能的影响对 并行GC 和 串行GC 是一样的。但是启用 并行GC 应该会缩短暂停时间。

老年代碎片化

因为 多个GC线程 同时参与到 Minor GC 中,所以可能会在 “从 新生代 提升到 老年代” 的过程中产生一些碎片。每个 GC 线程都会在 Minor GC 中预留一部分老年代的空间用于“提升”操作。而这个划分 “提升缓冲区” 的操作会产生碎片。

减少 GC 线程数量 和 增大老年代容量 可以降低此“碎片化效果”。

 

“代” 划分

如前所述,并行GC 中“代”的划分方式不同。如下图所示࿱

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值