下面是关于如何做 JDK8 的垃圾收集器调优的完整攻略:
前言
Java 作为一门高级语言,在垃圾回收上具有很大优势,JDK8 中垃圾收集器不仅越来越多,同时也变得越来越复杂。垃圾收集器调优无疑成为优化 Java 性能的关键),以下将详细介绍如何做JDK8的垃圾收集器调优。
收集器种类
JDK8 中常用的垃圾收集器有以下几种:
- Serial 收集器:适用于单处理器机器和小型应用;
- Parallel 收集器:适用于多CPU或多核心服务环境;
- CMS 收集器:适用于大内存服务环境;
- G1 收集器:JDK7 中引入的,适用于大内存服务环境,可以取代 CMS。
接下来,将会针对不同的场景,分别介绍垃圾收集器的调优方法。
单CPU场景
在单 CPU 的场景下,我们需要采用 Serial 收集器。优化方法如下:
- 启用动态分配年轻代大小,使其逐渐变大
-XX:NewRatio=年老代/年轻代大小
:
例如:1 表示年轻代占整个 Java 堆大小的 1/2, 3 表示年轻代占整个 Java 堆大小的 1/4。
- 初始堆大小不要太大,减少相关的方法区的内存占用,可以使用下列参数:
-Xms64m -Xmx64m -XX:PermSize=32M -XX:MaxPermSize=32M
以上参数可以设置堆内存为 64MB,方法区内存为 32MB。
多CPU场景
在多 CPU 的场景下,我们需要采用 Parallel 收集器。在调优过程中,我们需要根据应用场景和硬件环境进行调整,以下是建议值:
- 根据应用类型和机器数量确定并行收集器的线程数:
-XX:ParallelGCThreads
:设置并发垃圾回收的线程数,建议设置为 CPU 数量。
- 配置堆大小:
-Xms1G -Xmx1G
:设置堆大小为 1G。
- 根据应用内存占用情况确定年轻代和幸存者代的大小:
-XX:SurvivorRatio
:设置幸存者代占比,如 8 表示幸存者代占年轻代的 1/8。
大内存场景
在大内存场景下,我们需要采用 CMS 或 G1 收集器。
CMS 收集器调优
CMS 收集器在 Java 6 和 7 中可以承载大量的内存,但随着 Java 8 的发布,在大内存场景下,G1 收集器逐渐替代了 CMS 收集器。
- 可以通过下面的参数来启用 CMS 收集器:
-XX:+UseConcMarkSweepGC
。
- 配置相关参数,使其更高拥有更好的性能:
-Xms5g -Xmx5g -XX:PermSize=256M -XX:MaxPermSize=256M -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly
以上参数可以设置堆内存为 5GB,方法区内存为 256MB,并行收集阈值为 70。
G1 收集器调优
G1 的特点是,在大内存场景下,更适合使用,G1 和 CMS 相比,最大的不同是标记压缩的算法和并发收集范围的技术。设置 G1 收集器的参数如下:
-XX:+UseG1GC
-XX:G1HeapRegionSize=32m
-XX:G1ReservePercent=20
-XX:InitiatingHeapOccupancyPercent=75
-
-XX:+UseG1GC
表示启用 G1 收集器。 -
-XX:G1HeapRegionSize
表示 G1 时生成的区域大小,默认为 1MB,建议为 32MB-256MB,具体大小需要测试以获得最佳性能。 -
-XX:G1ReservePercent
表示预定义一些堆内存,作为备选内存,避免在并发收集中添加前口号失败。默认为 10,建议设置为 20。 -
-XX:InitiatingHeapOccupancyPercent
:设置触发并发收集的堆占用率,默认为 45,建议设置为 75。
至此,JDK8 垃圾收集器的调优攻略就介绍完了。在实际应用中, 我们可以根据应用场景和硬件环境进行调整,找到最佳的垃圾收集器来优化应用程序的性能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:面试官:怎么做JDK8的垃圾收集器的调优(面试常问) - Python技术站