JVM 参数的调整

制定 JVM 参数模板是一个需要考虑多方面因素的复杂过程。以下是一个基本的步骤:

  1. 理解项目特点:首先,需要深入了解公司项目的性质、规模、复杂度和负载情况等特点。这些因素将直接影响 JVM 参数的选择。

  2. 参考 JVM 文档:JVM 提供了一系列参数,可以调整其性能和行为。你需要查阅官方文档以了解这些参数的含义和用途。

  3. 实验和测试:在制定 JVM 参数模板之前,建议进行一些实验和测试,以确定哪些参数对你的应用程序性能有正面或负面的影响。你可以使用一些基准测试工具和性能监控工具来帮助你找到最佳的 JVM 参数配置。

  4. 考虑环境和硬件:JVM 参数的选择还需要考虑应用程序运行的环境和硬件。例如,不同的操作系统、处理器架构和内存大小都会影响 JVM 的行为。

  5. 制定模板:基于上述步骤,你可以制定一个 JVM 参数模板。这个模板应该包括最佳的 JVM 参数配置,以及说明这些参数对应用程序性能的影响。

  6. 更新和优化:由于应用程序的需求和环境可能会发生变化,因此需要定期更新和优化 JVM 参数模板。

最后,需要注意的是,制定 JVM 参数模板是一项复杂的任务,需要经验丰富的开发人员或系统管理员进行操作。如果你不确定如何制定最佳的 JVM 参数配置,请咨询专业人士的建议。

假设我们要为一个基于Java的电商网站制定JVM参数模板,以下是一个可能的步骤:

  1. 理解项目特点:我们需要了解这个网站的规模、访问量、交互性质以及预期的负载情况等特点。例如,这个网站可能会面临大量并发请求,需要处理复杂的业务逻辑,同时需要与多个外部系统进行交互。

  2. 参考JVM文档:我们需要查阅官方文档,了解JVM参数的含义和用途。例如,我们可以查看-Xmx、-Xms、-XX:+UseG1GC、-XX:+UseCompressedOops等参数的说明。

  3. 实验和测试:我们可以使用一些基准测试工具和性能监控工具,例如JMeter、VisualVM等,来测试网站在不同的JVM参数配置下的性能表现。我们可以尝试不同的参数值和组合,以找到最佳的配置。

  4. 考虑环境和硬件:我们需要考虑网站运行的环境和硬件,例如操作系统、处理器架构、内存大小等。这些因素都会影响JVM的行为和性能。

  5. 制定模板:基于上述步骤,我们可以制定一个JVM参数模板。例如,我们可以设置以下参数:

-XX:+UseG1GC:使用G1垃圾回收器,以提高内存使用效率和性能。 -XX:MaxGCPauseMillis=200:设置GC最大暂停时间为200ms,以避免GC造成的长时间停顿。 -Xms4g -Xmx4g:设置JVM最小堆大小和最大堆大小均为4GB,以满足网站的内存需求。 -XX:+UseCompressedOops:启用指针压缩,以减小对象指针大小,提高内存使用效率。 -XX:ParallelGCThreads=4:设置并行GC线程数为4,以充分利用多核CPU的性能。

  1. 更新和优化:我们需要定期更新和优化JVM参数模板,以适应网站的变化和新的技术趋势。

这是一个简单的例子,实际上,制定JVM参数模板可能涉及到更多的细节和考虑因素。

调优堆栈内存

表 1. 堆栈大小典型配置参数
配置参数 说明 示例
-Xmx 设置最大堆大小。 -Xmx3550m,设置JVM最大可用内存为3550 MB。
-Xms 设置JVM初始内存。 -Xms3550m,设置JVM初始内存为3550 MB。此值建议与-Xmx相同,避免每次垃圾回收完成后JVM重新分配内存。
-Xmn 设置年轻代大小。 -Xmn2g,设置年轻代大小为2 GB。整个JVM内存大小=年轻代大小+年老代大小+持久代大小。持久代一般固定大小为64 MB,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-Xss 设置线程的栈大小。 -Xss128k,设置每个线程的栈大小为128 KB。

说明 JDK 5.0版本以后每个线程栈大小为1 MB,JDK 5.0以前版本每个线程栈大小为256 KB。请依据应用的线程所需内存大小进行调整。在相同物理内存下,减小该值可以生成更多的线程。但是操作系统对一个进程内的线程个数有一定的限制,无法无限生成,一般在3000个~5000个。

-XX:NewRatio=n 设置年轻代和年老代的比值。 -XX:NewRatio=4,设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。如果设置为4,那么年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5。
-XX:SurvivorRatio=n 年轻代中Eden区与两个Survivor区的比值。 -XX:SurvivorRatio=4,设置年轻代中Eden区与Survivor区的大小比值。如果设置为4,那么两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6。
-XX:MaxPermSize=n 设置持久代大小。 -XX:MaxPermSize=16m,设置持久代大小为16 MB。
-XX:MaxTenuringThreshold=n 设置垃圾最大年龄。 -XX:MaxTenuringThreshold=0,设置垃圾最大年龄。
  • 如果设置为0,那么年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,提高了效率。
  • 如果将此值设置为较大值,那么年轻代对象会在Survivor区进行多次复制,增加了对象在年轻代的存活时间,增加在年轻代即被回收的概率。

调优回收器GC

表 2. 吞吐量优先的GC典型配置参数
配置参数 说明 示例
-XX:+UseParallelGC 选择垃圾收集器为并行收集器。 -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20-XX:+UseParallelGC此配置仅对年轻代有效,即在示例配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。
-XX:ParallelGCThreads 配置并行收集器的线程数,即同时多少个线程一起进行垃圾回收。

说明 此值建议配置与处理器数目相等。

-Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20-XX:ParallelGCThreads=20表示配置并行收集器的线程数为20个。
-XX:+UseParallelOldGC 配置年老代垃圾收集方式为并行收集。

说明 JDK 6.0支持对年老代并行收集。

-Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC-XX:+UseParallelOldGC表示对年老代进行并行收集。
-XX:MaxGCPauseMillis 设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。 -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100-XX:MaxGCPauseMillis=100设置每次年轻代垃圾回收的最长时间为100 ms。
-XX:+UseAdaptiveSizePolicy 设置此选项后,并行收集器自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低响应时该间或者收集频率,该值建议使用并行收集器时,并且一直打开。 -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100 -XX:+UseAdaptiveSizePolicy
表 3. 响应时间优先的GC典型配置参数
配置参数 说明 示例
-XX:+UseConcMarkSweepGC 设置年老代为并发收集。

说明 配置了-XX:+UseConcMarkSweepGC,建议年轻代大小使用-Xmn设置。

-Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
-XX:+UseParNewGC 设置年轻代为并行收集。

可与CMS收集同时使用。JDK 5.0以上版本,JVM根据系统配置自行设置,无需再设置此值。

-Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
-XX:CMSFullGCsBeforeCompaction 由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理。 -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection-XX:CMSFullGCsBeforeCompaction=5,表示运行GC5次后对内存空间进行压缩、整理。
-XX:+UseCMSCompactAtFullCollection 打开对年老代的压缩。

说明 该值可能会影响性能,但是可以消除碎片。

-Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection
表 4. 用于辅助的GC典型配置参数
配置参数 说明
-XX:+PrintGC 用于输出GC日志。
-XX:+PrintGCDetails 用于输出GC日志。
-XX:+PrintGCTimeStamps 用于输出GC时间戳(JVM启动到当前日期的总时长的时间戳形式)。示例如下:

0.855: [GC (Allocation Failure) [PSYoungGen: 33280K->5118K(38400K)] 33280K->5663K(125952K), 0.0067629 secs] [Times: user=0.01 sys=0.01, real=0.00 secs]

-XX:+PrintGCDateStamps 用于输出GC时间戳(日期形式)。示例如下:

2022-01-27T16:22:20.885+0800: 0.299: [GC pause (G1 Evacuation Pause) (young), 0.0036685 secs]

-XX:+PrintHeapAtGC 在进行GC前后打印出堆的信息。
-Xloggc:../logs/gc.log 日志文件的输出路径。

猜你喜欢

转载自blog.csdn.net/bareape/article/details/129435228
今日推荐