本文是JVM系列第6篇

JVM功用调优的方针和办法

JVM功用调优的方针是使JVM在运转Java运用程序时能够更加高效地利用计算机的资源,以进步运用程序的功用和呼应才能。详细来说,JVM功用调优的方针能够包含以下几个方面:

  1. 进步运用程序的吞吐量:经过优化JVM的内存办理、废物收回和线程办理等方面,削减JVM的开支,进步运用程序的吞吐量。
  2. 削减运用程序的推迟:经过优化JVM的废物收回战略、调整线程池巨细等方面,削减运用程序的推迟,进步用户体会。
  3. 削减JVM的内存占用:经过优化JVM的内存办理战略,削减JVM的内存占用,进步体系的稳定性。

JVM功用调优的办法能够包含以下几个方面:

  1. 调整JVM的内存参数:经过调整JVM的内存参数(如-Xms、-Xmx、-Xmn等),操控JVM的堆内存和非堆内存的巨细,防止内存走漏和OOM(Out Of Memory)等问题。
  2. 挑选适宜的废物收回器:JVM供给了多种废物收回器(如Serial、Parallel、CMS、G1等),依据运用程序的特色挑选适宜的废物收回器,并调整其参数,以到达最佳的废物收回效果。
  3. 调整线程池巨细:经过调整线程池巨细,防止线程过多或过少的状况,然后进步运用程序的并发处理才能。
  4. 运用功用剖析东西:运用功用剖析东西(如JProfiler、VisualVM、Arthas东西;jstst jstack jmap指令等)对运用程序进行剖析,找出瓶颈和功用问题,并进行优化。
  5. 优化代码:优化代码(如防止频频创立方针、防止过多的办法调用等),削减JVM的开支,进步运用程序的功用。

JVM功用调优的方针和东西

JVM功用调优的方针是衡量JVM功用的重要规范,常见的方针包含以下几个方面:

  1. 堆内存运用率:表明JVM堆内存的运用状况,一般应该操控在70%以下,防止出现OOM等内存问题。
  2. 废物收回时刻:表明JVM进行废物收回所消耗的时刻,过长的废物收回时刻会影呼运用程序的功用。
  3. 线程数:表明JVM当前运转的线程数,过多或过少的线程数都会影呼运用程序的功用。
  4. CPU运用率:表明JVM占用CPU的状况,过高的CPU运用率会影呼运用程序的功用。
  5. 呼应时刻:表明运用程序呼应恳求的时刻,应尽或许缩短呼应时刻,进步用户体会。

常用的JVM功用调优东西包含以下几个方面:

  1. JVisualVM:是JDK自带的一个功用剖析东西,能够用于监控JVM的堆内存、废物收回、线程等状况,并能够进行线程剖析、内存剖析等操作。
  2. JProfiler:是一款商业的功用剖析东西,能够供给更为详尽的功用剖析和优化,支撑多种JVM环境和运用程序类型。
  3. GCViewer:是一款开源的废物收回日志剖析东西,能够用于剖析JVM的GC日志,协助用户理解废物收回的状况。
  4. VisualGC:是一款可视化的JVM功用监控东西,能够用于实时监控JVM的内存、废物收回等状况。
  5. Perf:是一款Linux体系自带的功用剖析东西,能够用于监控体系的CPU、内存、I/O等状况,也能够用于监控JVM的功用。
  6. MAT:MAT是一款Java内存剖析器,全称为Eclipse Memory Analyzer Tool。MAT能够协助开发人员快速剖析Java运用程序的内存运用状况,找出内存走漏和内存糟蹋等问题,并供给优化主张。

JVM功用调优的技巧和主张

以下是JVM功用调优的一些技巧和主张:

  1. 挑选适宜的废物收回器:依据运用程序的特色挑选适宜的废物收回器,并依据实际状况调整其参数。不同的废物收回器适用于不同的运用场景。
  2. 操控堆内存巨细:经过调整JVM的堆内存巨细,防止内存走漏和OOM等问题。一般主张将-Xmx参数设置为物理内存的70%左右。
  3. 防止创立过多的方针:尽量防止在循环中频频创立方针,能够运用方针池等技术优化代码。
  4. 运用线程池:经过运用线程池,能够防止线程过多或过少的状况,进步运用程序的并发处理才能。
  5. 防止过多的办法调用:过多的办法调用会增加JVM的开支,影呼运用程序的功用。能够经过内联等技术优化代码。
  6. 防止过度同步:过度同步会降低运用程序的并发处理才能,影呼运用程序的功用。能够经过运用锁分离等技术优化代码。
  7. 运用功用剖析东西:运用功用剖析东西协助定位功用瓶颈和问题,并进行优化。常用的功用剖析东西包含JProfiler、VisualVM、GCViewer等。
  8. 定期进行功用测验:定期进行功用测验,发现功用问题并及时进行优化。能够运用JMeter等东西进行功用测验。
  9. 优化JVM发动参数:经过调整JVM发动参数,能够进步JVM的功用和稳定性。常用的JVM发动参数包含-Xms、-Xmx、-XX:+UseG1GC等。

总归,JVM功用调优是一个复杂的过程,需求依据详细的运用程序进行优化。经过合理挑选废物收回器、操控堆内存巨细、优化代码等技术手段,能够进步JVM的功用和稳定性,进步运用程序的功用和呼应才能。

JVM功用调优实战

JVM相关参数

JVM参数分为3类:

  • 规范参数(-),所有JVM都必须支撑这些参数的功用,而且向后兼容
  • 非规范参数(-X),默认JVM完成这些参数的功用,可是并不保证所有JVM完成都满意,且不保证向后兼容
  • 非稳定参数(-XX),此类参数各个JVM完成会有所不同,将来或许会不被支撑,需求稳重运用

JVM规范参数

  1. -server/-client:指定JVM运转形式,-server表明服务器形式,优化长时刻运转的服务器运用程序,-client表明客户端形式,优化发动速度和呼应时刻。
  2. -classpath/-cp:指定类路径,用于查找类文件和资源文件。
  3. -Dproperty=value:设置体系特点,能够在运用程序中经过System.getProperty()办法获取。
  4. -verbose:class:显现类加载信息,包含类名、加载时刻和类加载器等。
  5. -version:显现JVM版别信息。
  6. -showversion:显现JVM版别信息和构建信息。
  7. -help:显现JVM指令行参数协助信息。

仓库内存设置参数

  1. -Xms:初始堆巨细,默认值为内存的1/64
  2. -Xmx:最大堆巨细,默认值为内存1/4
  3. -Xmn:年青代初始巨细,-Xmn参数的默认值为年青代和老时代的份额为1:2,即年青代占整个堆的1/3
  4. -XX:NewSize:设置年青代巨细;-Xmn和-XX:NewSize区别:参数的效果规模不同:-Xmn参数只效果于年青代,而-XX:NewSize参数效果于年青代和Survivor区;参数的默认值不同:-Xmn参数的默认值是依据堆巨细计算得出的,而-XX:NewSize参数的默认值为0,表明JVM会主动计算年青代和Survivor区的巨细
  5. -XX:MaxNewSize:年青代最大值
  6. -XX:NewRatio:年青代(包含Eden和两个Survivor区)与年老代的比值(除去耐久代)
  7. -XX:SurvivorRatio:Eden区与Survivor区的巨细比值,默认值设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年青代的1/10
  8. -Xss:每个线程的仓库巨细,JDK5.0以后每个线程仓库巨细默认值为1M
  9. -XX:ThreadStackSize:用于设置线程栈的巨细 -Xss和-XX:ThreadStackSize区别:参数的效果规模不同:-XX:ThreadStackSize参数用于设置所有线程的栈巨细,而-Xss参数用于设置单个线程的栈巨细
  10. -XX:LargePageSizeInBytes:用于设置大页面的巨细。启用大页面能够进步内存拜访的效率,然后进步运用程序的功用和呼应才能。可是需求留意的是,启用大页面或许会导致内存碎片的问题,然后影响内存的运用效率和稳定性。
  11. -XX:MaxTenuringThreshold:用于设置方针在年青代和老时代之间存活的最大年龄。年青代是Java堆内存中的一部分,用于存放新创立的方针。当年青代满了之后,会触发一次废物收回,将存活的方针移动到老时代中。默认值为15,表明方针最多存活15次废物收回之后,就会被移动到老时代中。
  12. -Xnoclassgc:用于操控JVM是否在废物收回时收回无用的类。
  13. -XX:SoftRefLRUPolicyMSPerMB:用于设置软引证方针的LRU战略的时刻限制。默认值为1000,表明每MB内存空间能够存活1秒钟的软引证方针。能够经过设置-XX:SoftRefLRUPolicyMSPerMB参数来调整软引证方针的LRU战略,然后影响软引证方针的收回战略和内存占用。
  14. -XX:PretenureSizeThreshold:用于设置方针在新生代内存区域中直接进入老时代内存区域的阈值巨细。默认值为0,表明禁用直接进入老时代。
  15. -XX:TLABWasteTargetPercent:用于设置线程本地分配缓冲区(Thread Local Allocation Buffer, TLAB)的糟蹋阈值百分比。默认值为1,表明线程本地分配缓冲区中糟蹋的空间不能超过总空间的1%。
  16. -XX:+CollectGen0First:用于操控JVM在进行Full GC时是否先收回新生代内存区域。

元数据设置参数

  1. -XX:MetaspaceSize:设置元数据区初始巨细。
  2. -XX:MaxMetaspaceSize:设置元数据区最大巨细。
  3. -XX:MinMetaspaceFreeRatio:设置元数据区最小自由空间比率。
  4. -XX:MaxMetaspaceFreeRatio:设置元数据区最大自由空间比率。

JIT设置参数

废物搜集器设置参数

参数称号 含义 默认值
-XX:+UseParallelGCFull GC采用parallel MSC 挑选废物搜集器为并行搜集器.此装备仅对年青代有效.即上述装备下,年青代运用并发搜集,而年老代依旧运用串行搜集.
-XX:+UseParNewGC 设置年青代为并行搜集 可与CMS搜集一起运用JDK5.0以上,JVM会依据体系装备自行设置,所以无需再设置此值
-XX:ParallelGCThreads 并行搜集器的线程数此值最好装备与处理器数目持平 相同适用于CMS
-XX:+UseParallelOldGC 年老代废物搜集办法为并行搜集(Parallel Compacting) 这个是JAVA 6出现的参数选项
-XX:MaxGCPauseMillis 每次年青代废物收回的最长时刻(最大暂停时刻) 假如无法满意此时刻,JVM会主动调整年青代巨细,以满意此值.
-XX:+UseAdaptiveSizePolicy 主动挑选年青代区巨细和相应的Survivor区份额 设置此选项后,并行搜集器会主动挑选年青代区巨细和相应的Survivor区份额,以到达方针体系规定的最低相应时刻或许搜集频率等,此值主张运用并行搜集器时,一直打开.
-XX:GCTimeRatio 设置废物收回时刻占程序运转时刻的百分比公式为 1/(1+n)
-XX:+ScavengeBeforeFullGCFull GC前调用YGCtrue Do young generation GC prior to a full GC.

CMS相关参数

  1. -XX:+UseConcMarkSweepGC:运用CMS内存搜集
  2. -XX:+AggressiveHeap :用于启用一个依据功用的堆内存装备。启用该参数后,JVM会依据当前体系的硬件装备和内存运用状况来主动调整堆内存的巨细和废物收回战略,以到达最佳的功用和内存利用率。
  3. -XX:CMSFullGCsBeforeCompaction :多少次后进行内存压缩
  4. -XX:+CMSParallelRemarkEnabled:降低符号停顿
  5. -XX+UseCMSCompactAtFullCollection:在FULL GC的时分, 对年老代的压缩
  6. -XX:+UseCMSInitiatingOccupancyOnly:运用手动定义初始化定义开端CMS搜集
  7. -XX:CMSInitiatingOccupancyFraction=70:运用cms作为废物收回运用70%后开端CMS搜集

GC日志设置参数

  1. -XX:+PrintGC:输出形式:
    [GC 118250K->113543K(130112K), 0.0094143 secs]
    [Full GC 121376K->10414K(130112K), 0.0650971 secs]
  2. -XX:+PrintGCDetails:输出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs]
    [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]
  3. -XX:+PrintGCTimeStamps
  4. -XX:+PrintGC:PrintGCTimeStamps:可与-XX:+PrintGC -XX:+PrintGCDetails混合运用
    输出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs]
  5. -XX:+PrintGCApplicationStoppedTime:打印废物收回期间程序暂停的时刻.可与上面混合运用
  6. -XX:+PrintGCApplicationConcurrentTime:打印每次废物收回前,程序未中断的执行时刻.可与上面混合运用
  7. -XX:+PrintHeapAtGC :打印GC前后的详细仓库信息
  8. -Xloggc:filename:把相关日志信息记录到文件以便剖析. 与上面几个配合运用
  9. -XX:+PrintClassHistogram
  10. -XX:+PrintTLAB
  11. -XX:+PrintTenuringDistribution:检查每次minor GC后新的存活周期的阈值

其他

  1. -XX:+UseFastAccessorMethods:用于启用快速拜访器办法。快速拜访器办法是一种优化技术,能够经过直接拜访方针的字段,而不是经过getter和setter办法来拜访方针的特点,然后进步拜访方针的特点的效率。参数为true来启用快速拜访器办法。需求留意的是,启用快速拜访器办法或许会影响程序的可维护性和扩展性,因为它会暴露方针的内部完成细节,然后使得代码更加依赖于方针的详细完成。因而,需求依据详细的运用场景和需求进行挑选和调整。
  2. -XX:+DisableExplicitGC:封闭System.gc()
  3. -XX:+UseBiasedLocking:锁机制的功用改善
  4. -XX:MaxDirectMemorySize:设置直接内存最大巨细

实战装备

G1废物搜集器功用调优

参阅 G1废物收回参数调优及MySQL虚引证造成GC时刻过长剖析

待后续更新

参阅
JDK8一套通用的JVM参数装备(含排查GC问题或许需求的参数)

JVM系列文章

标题 介绍
JVM-JVM简介及架构概述 JVM介绍 架构
JVM-类加载及类加载器 类加载机制
JVM-运转时数据区 JVM运转时数据区
JVM-废物搜集器及废物收回算法 废物搜集器和收回算法
JVM-JIT编译器 JIT编译优化
JVM-JVM功用调优 JVM 参数功用调优