JVM参数调优

92 篇文章 0 订阅
14 篇文章 0 订阅

基本参数

参数说明
-server启动 Server模式(64位 JVM默认开启)
-Xms4096m设置初始堆大小(不包含永久代/元空间), 等价于 -XX:InitialHeapSize. -Xms的默认值为物理内存大小的1/64
-Xmx4096m设置最大堆大小(不包含永久代/元空间), 等价于 -XX:MaxHeapSize. -Xmx的默认值为物理内存大小的1/4. 建议设置与 -Xms相同的值,其目的是为了垃圾回收后, 不再需要重新分隔计算堆区的大小, 以此提高性能
-Xss512k设置每个线程栈大小, 此参将会直接关系到每个进程能开启的线程数和递归调用的深度, 默认值为1m
-Xmn1408m设置年轻代大小, 等价于 -XX:NewSize-XX:MaxNewSize, 此参一般使用默认值, 因为与选项 -XX:NewRatio相互矛盾, 当然如果设置了优先级高于 -XX:NewRatio
-XX:PermSize64m设置内存持久代区初始大小, jdk1.8开始此参已过时
-XX:MaxPermSize64m设置内存持久代区最大大小, jdk1.8开始此参已过时
-XX:NewRatio2设置年轻代(Eden区+Survivor区)与老年代的比例, 如设置3, 则年轻代1(1/4), 老年代3(3/4), 默认值为2
-XX:SurvivorRatio8设置年轻代中 Eden区与 Survivor(from/to)区的比例, 如设置6, eden:from:to = 6:1:1, 默认值为8, 不过实际内部分配是6(由于有自适应机制 -XX:-UseAdaptiveSizePolicy, 不过此参即使关了也同样无法撤销), 所以如需8的占比, 则需要显式的指明8
-XX:+UseTLAB是否开启(默认开启)
-XX:TLABWasteTargetPercent1设置 TLAB空间所占用 Eden空间的百分比大小(默认只有1%)
-XX:+DoEscapeAnalysis显式开启逃逸分析(JDK7开始默认开启), JVM启动模式必须为 server, 才可以启用逃逸分析
-XX:+EliminateLocks开启同步消除
-XX:+EliminateAllocations开启标量替换(默认开启), 允许将对象打散分配在栈上
-XX:+PrintEscapeAnalysis查看逃逸分析的筛选结果
-XX:+PrintEliminateAllocations查看标量替换详情
-XX:InitialTenuringThreshold7设置对象在年轻代中存活的次数初始值, 该参数在首次 Minor GC时用于判断对象是否需要移动到老年代, 默认值为7
-XX:MaxTenuringThreshold15设置对象在年轻代中存活的次数最大值, 如设置为0, 则年轻代对象不经过 Survivor区, 而直接进入老年代, 默认值为15
-XX:TargetSurvivorRatio80表示 Minor GC结束后 Survivor区中占用空间的期望比例, 当存放的对象超过这个数值, 则对象会被移动到老年代, 默认值为50, 即 Survivor(from/to)区的对象目标使用率为50%
-XX:+PrintTenuringDistribution每次 Minor GC之后打印 Survivor空间中对象的年龄分布
-XX:+PrintGC打印简要 GC信息, GC前的堆栈信息和 GC后的堆栈大小和堆栈的总大小
-XX:+PrintGCDetails按不同参数, 如不同收集器打印的日志不同
-XX:+PrintFlagsInitial查看所有参数的默认初始值
-XX:+PrintFlagsFinal查看所有参数的最终值(输出已改过的最终值)
-XX:+PrintGCTimeStamps打印当前行垃圾收集的时间秒
-XX:+DisableExplicitGC忽略 System.gc()
-XX:StringTableSize60013Jdk6中 StringTable默认的 bucket数量是1009, 但 Jdk7开始该默认值被改为60013. 还有 Jdk8开始可以设的最小值为1009
-XX:+PrintStringTableStatistics打印 StringTable的统计信息(默认未开启)
-XX:+UseStringDeduplication开启 String去重(默认未启用)
-XX:+PrintStringDeduplicationStatistics打印去重统计信息
-XX:StringDeduplicationAgeThreshold3字符串对象经过3次 GC后, 如果还存活着, 就会成为去重的候选对象(默认3次)
-Xint只采用解释器模式执行程序
-Xcomp只采用编译器模式执行程序, 如果即时编译出了问题, 解释器会介入执行
-Xmixed采用解释器和即时编译器的混合模式共同执行程序(默认)
-XX:CompileThreshold10000方法被调用次数或循环体回边累计次数, 以此达到被即时编译器编译的条件. (client模式下默认调用次数为 1500, server模式下默认调用次数为 10000)
-XX:CounterHalfLifeTime300当开启了热度衰减-XX:+UseCounterDecay(默认开启)时, 被调用的次数不是绝对次数, 而是指定时间段的执行频率, 如果超过了指定的时间段, 同时被调用次数仍不足以让它提交给即时编译器编译, 此时方法的调用次数会被消减一半. 这段时间称之为半衰周期, 可通过此参调整半衰周期, 单位为秒(此参貌似只能在调试时可用)
-XX:-UseCounterDecay关闭热度衰减(默认开启), 被调用的次数就成为绝对次数, 这样只要系统运行足够长, 绝大部分的热点代码都会被编译成本地代码并缓存
-XX:+TieredCompilation分层编译策略: 解释执行时不开启性能监控, 则会触发 C1编译. 如果开启了, C2编译器会根据性能监控信息进行激进优化. Jdk7开始服务端模式会默认开启分层编译策略
-Xloggc:D:/logs/gc.log日志信息记录到指定文件
-XX:+HeapDumpOnOutOfMemoryError当堆空间溢出时导出内存快照, 参数指定导出目录: -XX:HeapDumpPath=/Users/quanchunlin/Desktop, 导出的 hprof文件通过 MAT(Memory Analyzer Tool)工具分析溢出原因

Serial垃圾收集器相关参数

参数说明
-XX:+UseSerialGC设置串行收集器, 默认同时开启 Serial Old老年代收集器

Parallel垃圾收集器相关参数

参数说明
-XX:+UseParallelGC设置并行收集器, 吞吐量优先时用此收集器, 仅对年轻代有效, 不能与 CMS收集器配合工作
-XX:+UseParallelOldGC设置并行老年代收集器
-XX:ParallelGCThreads8设置并行收集器的线程数, 默认与 CPU的核数是相同的, 建议设置小于核数, 不建议设大于核数. 当核数大于8个 ParallelGCThreads=3 + (5 * cpu core / 8)
-XX:MaxGCPauseMillis200设置期望达到的最大 GC停顿时间. 默认值为200ms
-XX:GCTimeRatio99设置垃圾回收时间占总时间的比率(吞吐量), 取值范围是大于0, 且小于100的整数, 默认值为99, 也就是允许最大1%(即1 / ( 1 + 99))的垃圾收集时间. 此参与 -XX:MaxGCPauseMillis有一定矛盾性
-XX:+UseAdaptiveSizePolicy设置动态调整年轻代(Eden区+Survivor区)的比例, 计算依据是 GC过程中统计的 GC时间, 吞吐量, 内存占用量, 此参数适用与并行收集器, 在 CMS并发收集器时默认关闭

ParNew& CMS垃圾收集器相关参数

参数说明
-XX:+UseParNewGC设置并发串行收集器, 响应时间优先时用此收集器, 仅对年轻代有效, 能与 CMS并发收集器配合工作
-XX:+UseConcMarkSweepGC设置老年代 CMS并发收集器
-XX:ParallelGCThreads8设置收集器的线程数, 默认与 CPU的核数是相同的, 建议设置小于核数, 不建议设大于核数. 当核数大于8个 ParallelGCThreads=3 + (5 * cpu core / 8)
-XX:ParallelCMSThreads2设置 CMS并发收集器的线程数, 默认启动的线程数是(ParallelGCThreads + 3) / 4 = 2; ParallelGCThreads是新年代 ParNew并行收集器的线程数
XX:CMSInitiatingOccupanyFraction20Jdk6之前默认值为68%, 之后92%. 一旦到达该阈值即触发回收
-XX:+UseCMSCompactAtFullCollection在配置了 CMS并发收集器时, 对老年代的压缩, 此参会使垃圾收集停顿时间变长, jdk1.8开始此参已过时
-XX:CMSFullGCsBeforeCompaction5在上面配置开启的前提下, 在此参设置多少次 Full GC后, 对老年代进行压缩, jdk1.8开始此参已过时
-XX:+CMSParallelRemarkEnabled设置尽量降低标记停顿
-XX:+CMSScavengeBeforeRemark开启 CMS重新标记阶段之前, 尝试清除 young GC来有效降低 remark时间, 注: 即使开启也并不会保证在标记阶段前一定会进行清除操作
-XX:+CMSPermGenSweepingEnabled设置永久代进行垃圾回收, 为了避免持久代(Perm Gen)区满引起的 Full GC, JDK 1.5建议开启
-XX:+CMSClassUnloadingEnabled设置永久代进行垃圾回收, 为了避免持久代(Perm Gen)区满引起的 Full GC, JDK 1.6~建议开启
-XX:CMSInitiatingOccupancyFraction70设置 CMS作为垃圾回收使用 70%后开始收集
-XX:+UseCMSInitiatingOccupancyOnly在上面配置开启的前提下, 设置此参, 如不设置此参, JVM只会在第一次按设定的70% GC, 后续则自动调整

G1垃圾收集器相关参数

参数说明
-XX:+UseG1GC显式指定 G1垃圾收集器
-XX:G1HeapRegionSize设置每个 Region的大小, 大小范围是1~32MB之间, 就是2的幂, 即1MB, 2MB … 16MB, 32MB. 目标是根据最小的 Java堆大小划分出约2048个区域. 默认为堆内存的1/2000
-XX:MaxGCPauseMillis200设置期望达到的最大 GC停顿时间. 默认值为200ms
-XX:ParallelGCThreads8设置收集器的线程数, 默认与 CPU的核数是相同的, 建议设置小于核数, 不建议设大于核数. 当核数大于8个 ParallelGCThreads=3 + (5 * cpu core / 8)
-XX:ConcGCThreads设置并发标记的线程数. 将n设置为并行垃圾回收线程数(ParallelGCThreads)的1/4左右
-XX:InitiatingHeapOccupancyPercent45设置触发 GC的堆占比, 默认值为 45%
-XX:G1MixedGCCountTarget8混合垃圾回收的目标次数, 默认值为8
-XX:G1MixedGCLiveThresholdPercent65指定垃圾占内存分段比率, 一旦到此比率就会被回收, 默认值为65%
-XX:G1HeapWastePercent10设置允许浪费的堆占比, 如果未达到此阈值, 则不进行混合回收, 默认值为10%

设置堆大小, 各种堆使用比列和线程堆栈大小

  • 注: 32位系统和 Jdk5.0或以下版本有堆大小限制
  1. 年轻代设置过小时
  • Minor GC次数过于频繁, 因此消耗大量系统资源
  • 大对象直接进入老年代, 占据大量老年代的空间, 导致老年代的 Major GC/Full GC频率上升
  1. 年轻代设置过大时
  • 年轻代过于大, 可能会导致老年代过于太小, 导致老年代的 Major GC/Full GC频率上升
  • Minor GC耗时大幅度增加, 一般年轻代占整个堆的1/3比较合适
  1. Survivor区设置过小
  • 会导致对象从 Eden直接到达老年代, 降低了对象在年轻代的存活时间, 导致老年代的 Major GC/Full GC频率上升
  1. Survivor区设置过大
  • 会导致 Eden过小, 增加了 Minor GC频率
    * 通过 -XX:MaxTenuringThreshold来控制年轻代存活时间, 尽量让对象在年轻代被回收

> java -Xms4096m -Xmx4096m -Xss512k -Xmn1408m -XX:NewRatio=2 -XX:SurvivorRatio=8

> C:\Program Files\Java\jdk1.8.0_121\bin>jmap -heap 17388
Attaching to process ID 17388, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.121-b13

using thread-local object allocation.
Parallel GC with 4 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 4294967296 (4096.0MB)
   NewSize                  = 1476395008 (1408.0MB)
   MaxNewSize               = 1476395008 (1408.0MB)
   OldSize                  = 2818572288 (2688.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 1107296256 (1056.0MB)
   used     = 638743664 (609.1534271240234MB)
   free     = 468552592 (446.84657287597656MB)
   57.68498362916888% used
From Space:
   capacity = 184549376 (176.0MB)
   used     = 29029488 (27.684677124023438MB)
   free     = 155519888 (148.31532287597656MB)
   15.729930184104226% used
To Space:
   capacity = 184549376 (176.0MB)
   used     = 0 (0.0MB)
   free     = 184549376 (176.0MB)
   0.0% used
PS Old Generation
   capacity = 2818572288 (2688.0MB)
   used     = 40623056 (38.74116516113281MB)
   free     = 2777949232 (2649.258834838867MB)
   1.441263584863572% used

29331 interned Strings occupying 3545216 bytes.

设置回收器

  • JVM支持三种回收器: 串行收集器, 并行收集器, 并发收集器 其中串行收集器只适用于小数据量, 目前主要用的收集器为并行和并发收集器

吞吐量优先时

  • 选择 -XX:+UseParallelGC并行收集器
  • 年轻代尽可能设大些, 因为对响应时间没有要求, 垃圾收集可以并行进行
  • 设置很大的年轻代和一个较小的老年代, 让对象尽可能呆年轻代长一点, 减少因年轻代空间不足进入老年代的对象, 从而存老年代存放的尽是长期存活对象

> java -Xms1024m -Xmx1024m -Xss1m -Xmn256m -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:+UseParallelGC -XX:ParallelGCThreads=2 -XX:+UseParallelOldGC -XX:+UseAdaptiveSizePolicy -XX:+PrintTenuringDistribution -XX:InitialTenuringThreshold=7 -XX:MaxTenuringThreshold=15 -XX:+PrintGCDetails

[GC (Allocation Failure) 
Desired survivor size 26738688 bytes, new threshold 7 (max 15)
[PSYoungGen: 209920K->8904K(236032K)] 209920K->8920K(1022464K), 0.0139137 secs] [Times: user=0.03 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) 
Desired survivor size 26738688 bytes, new threshold 7 (max 15)
[PSYoungGen: 218824K->13516K(236032K)] 218840K->13604K(1022464K), 0.0155481 secs] [Times: user=0.03 sys=0.00, real=0.02 secs] 
[GC (Metadata GC Threshold) 
Desired survivor size 26738688 bytes, new threshold 7 (max 15)
[PSYoungGen: 16890K->7879K(236032K)] 16978K->7967K(1022464K), 0.0097382 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[Full GC (Metadata GC Threshold) [PSYoungGen: 7879K->0K(236032K)] [ParOldGen: 88K->7876K(786432K)] 7967K->7876K(1022464K), [Metaspace: 20757K->20757K(1067008K)], 0.0509364 secs] [Times: user=0.06 sys=0.01, real=0.05 secs] 
[GC (Allocation Failure) 
Desired survivor size 26738688 bytes, new threshold 7 (max 15)
[PSYoungGen: 209920K->10039K(236032K)] 217796K->17923K(1022464K), 0.0090786 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) 
Desired survivor size 15204352 bytes, new threshold 6 (max 15)
[PSYoungGen: 219959K->12352K(236032K)] 227843K->20244K(1022464K), 0.0154359 secs] [Times: user=0.03 sys=0.00, real=0.02 secs] 
[GC (Allocation Failure) 
Desired survivor size 17301504 bytes, new threshold 5 (max 15)
[PSYoungGen: 222272K->14822K(243200K)] 230164K->23919K(1029632K), 0.0218318 secs] [Times: user=0.03 sys=0.00, real=0.02 secs] 
[GC (Allocation Failure) 
Desired survivor size 20447232 bytes, new threshold 4 (max 15)
[PSYoungGen: 243174K->16883K(245248K)] 252271K->27437K(1031680K), 0.0235152 secs] [Times: user=0.06 sys=0.00, real=0.02 secs] 
[GC (Metadata GC Threshold) 
Desired survivor size 20447232 bytes, new threshold 3 (max 15)
[PSYoungGen: 99329K->14334K(239104K)] 109884K->28850K(1025536K), 0.0208969 secs] [Times: user=0.05 sys=0.00, real=0.02 secs] 
[Full GC (Metadata GC Threshold) [PSYoungGen: 14334K->0K(239104K)] [ParOldGen: 14515K->24871K(786432K)] 28850K->24871K(1025536K), [Metaspace: 34711K->34711K(1079296K)], 0.1276143 secs] [Times: user=0.22 sys=0.00, real=0.13 secs] 
[GC (Allocation Failure) 
Desired survivor size 20447232 bytes, new threshold 2 (max 15)
[PSYoungGen: 222208K->8470K(242176K)] 247079K->33349K(1028608K), 0.0094479 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) 
Desired survivor size 19922944 bytes, new threshold 1 (max 15)
[PSYoungGen: 230678K->10952K(242688K)] 255557K->35839K(1029120K), 0.0143171 secs] [Times: user=0.03 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) 
Desired survivor size 19922944 bytes, new threshold 1 (max 15)
[PSYoungGen: 233672K->6599K(242176K)] 258559K->41714K(1028608K), 0.0218689 secs] [Times: user=0.06 sys=0.00, real=0.02 secs] 
[GC (Allocation Failure) 
Desired survivor size 20447232 bytes, new threshold 1 (max 15)
[PSYoungGen: 229319K->5088K(241664K)] 264434K->45417K(1028096K), 0.0130370 secs] [Times: user=0.02 sys=0.01, real=0.01 secs] 
[GC (Allocation Failure) 
Desired survivor size 20447232 bytes, new threshold 1 (max 15)
[PSYoungGen: 227296K->4781K(242176K)] 267625K->48626K(1028608K), 0.0128892 secs] [Times: user=0.03 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) 
Desired survivor size 20447232 bytes, new threshold 1 (max 15)
[PSYoungGen: 226989K->4421K(242176K)] 270834K->51126K(1028608K), 0.0112366 secs] [Times: user=0.03 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) 
Desired survivor size 20447232 bytes, new threshold 1 (max 15)
[PSYoungGen: 226629K->4620K(242176K)] 273334K->54033K(1028608K), 0.0311580 secs] [Times: user=0.06 sys=0.00, real=0.03 secs] 

  • GC (Allocation Failure)表示 Minor GC, 其中 ParNew: 226750K->23046K(235968K)表示年轻代 GC前已使用空间为226750K, GC后已使用空间为23046K, 年轻代总空间为235968K. 紧随其后的263699K->59995K(1022400K)表示 GC前整个堆的已使用空间为263699K, GC后已使用空间为59995K, 堆的总空间为1022400K

响应时间优先时

  • 选择 CMS并发收集器
  • 年轻代尽可能设适当的大, 由于堆大了需要较长 GC时间
  • 老年代使用并发收集器

CMS

  • CMS(Concurrent Low Pause Collector), 是 jdk1.4后期版本开始引入的新 gc算法, 在 jdk5和 jdk6中得到了进一步改进, 它的主要适合场景是对响应时间的重要性需求大于对吞吐量的要求
CMS收集周期
  • 初始标记(CMS-initial-mark) -> 并发标记(CMS-concurrent-mark) -> 重新标记(CMS-remark) -> 并发清除(CMS-concurrent-sweep) -> 并发重置状态等待下次 CMS的触发(CMS-concurrent-reset)
  • 其中 CMS-initial-mark和 CMS-remark是会暂停所有的应用程序线程的, 然后名称中包含 concurrent的过程是会并发地运行
CMS参数使用说明
  1. 垃圾回收先择 CMS并发收集器开启参数: -XX:+UseConcMarkSweepGC
  2. 设定 CMS回收线程数目通过参数: -XX:ParallelCMSThreads=n调整
  3. 为了防止堆碎片引起 Full GC, 开启 CMS阶段进行合并碎片参数: -XX:+UseCMSCompactAtFullCollection, 不过此参会使垃圾收集停顿时间变长, 因此需再通过参数: -XX:CMSFullGCsBeforeCompaction=n配置适当频次调整性能, jdk1.8开始此两参数已过时
  4. 为了减少暂停的时间, 开启并行 remark参数: -XX:+CMSParallelRemarkEnabled. 如果 remark还是过长可以再开启参数: -XX:+CMSScavengeBeforeRemark, CMS重新标记阶段之前, 尝试清除 young GC, 但是 remark后又会立即进行一次 Minor GC.
  5. 为了避免持久代(Perm Gen)区满引起的 Full GC, 设置永久代进行垃圾回收, jdk版本1.5开启参数: -XX:+CMSPermGenSweepingEnabled或 jdk版本1.6或以上开启参数: -XX:+CMSClassUnloadingEnabled
  6. 默认 CMS是在老年代(Tenured Generation)沾满68%的时候开始进行 CMS收集, 如果你的老年代增长不是那么快, 且希望降低 CMS频次, 可以适当调高此参数:
    -XX:CMSInitiatingOccupancyFraction=n

> java -Xms1024m -Xmx1024m -Xss1m -Xmn256m -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:ParallelCMSThreads=10 -XX:+CMSParallelRemarkEnabled -XX:+CMSScavengeBeforeRemark -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly -XX:+PrintTenuringDistribution -XX:InitialTenuringThreshold=7 -XX:MaxTenuringThreshold=15 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps

3.937: [GC (Allocation Failure) 3.937: [ParNew
Desired survivor size 13402112 bytes, new threshold 15 (max 15)
- age   1:    8524208 bytes,    8524208 total
: 209792K->8369K(235968K), 0.0113644 secs] 209792K->8369K(1022400K), 0.0114286 secs] [Times: user=0.06 sys=0.00, real=0.01 secs] 
5.272: [GC (Allocation Failure) 5.272: [ParNew
Desired survivor size 13402112 bytes, new threshold 15 (max 15)
- age   1:    9204024 bytes,    9204024 total
- age   2:    4085880 bytes,   13289904 total
: 218161K->14562K(235968K), 0.0179900 secs] 218161K->14562K(1022400K), 0.0180348 secs] [Times: user=0.02 sys=0.00, real=0.02 secs] 
6.521: [GC (Allocation Failure) 6.521: [ParNew
Desired survivor size 13402112 bytes, new threshold 3 (max 15)
- age   1:    9805040 bytes,    9805040 total
- age   2:    3481176 bytes,   13286216 total
- age   3:    4075312 bytes,   17361528 total
: 224354K->20923K(235968K), 0.0204933 secs] 224354K->20923K(1022400K), 0.0205472 secs] [Times: user=0.02 sys=0.00, real=0.02 secs] 
6.544: [GC (CMS Initial Mark) [1 CMS-initial-mark: 0K(786432K)] 20924K(1022400K), 0.0047161 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
6.548: [CMS-concurrent-mark-start]
6.549: [CMS-concurrent-mark: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
6.549: [CMS-concurrent-preclean-start]
6.551: [CMS-concurrent-preclean: 0.002/0.002 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
6.551: [CMS-concurrent-abortable-preclean-start]
7.169: [CMS-concurrent-abortable-preclean: 0.440/0.618 secs] [Times: user=1.05 sys=0.13, real=0.62 secs] 
7.169: [GC (CMS Final Remark) [YG occupancy: 130964 K (235968 K)]7.169: [GC (CMS Final Remark) 7.169: [ParNew
Desired survivor size 13402112 bytes, new threshold 15 (max 15)
- age   1:    4611288 bytes,    4611288 total
- age   2:    3927312 bytes,    8538600 total
- age   3:    3188752 bytes,   11727352 total
: 130964K->15306K(235968K), 0.0296249 secs] 130964K->19725K(1022400K), 0.0296603 secs] [Times: user=0.08 sys=0.02, real=0.03 secs] 
7.199: [Rescan (parallel) , 0.0057013 secs]7.204: [weak refs processing, 0.0000311 secs]7.205: [class unloading, 0.0025726 secs]7.207: [scrub symbol table, 0.0068768 secs]7.214: [scrub string table, 0.0005787 secs][1 CMS-remark: 4418K(786432K)] 19725K(1022400K), 0.0465941 secs] [Times: user=0.09 sys=0.02, real=0.05 secs] 
7.216: [CMS-concurrent-sweep-start]
7.222: [CMS-concurrent-sweep: 0.003/0.006 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
7.222: [CMS-concurrent-reset-start]
7.229: [CMS-concurrent-reset: 0.007/0.007 secs] [Times: user=0.02 sys=0.01, real=0.01 secs] 

日志记录执行过程解释

[GC (Allocation Failure) [ParNew: 表示年轻代 GC, 通过 UseParNewGC并发串行收集器收集
: 209792K->8369K(235968K), 0.0113644 secs]: 209792K表示年轻代收集前的大小, 8369K表示收集后的大小, (235968K)表示当前总容量大小, 表示收集年轻代所花费的时间, 单位秒
209792K->8369K(1022400K), 0.0114286 secs]: 表示当前对的收集前大小, 收集后大小和容量总大小及收集花费的时间
[Times: user=0.06 sys=0.00, real=0.01 secs]: 表示用户耗时, 系统耗时, 真实耗时

  • 3.937, 5.272, 6.521 三次年轻代分配失败(Allocation Failure), 对象直接进入老年代
  • 6.544: [GC (CMS Initial Mark) 老年代 CMS初始标记
  • 6.548: [CMS-concurrent-mark-start] 开始并发标记
  • 6.549: [CMS-concurrent-preclean-start] 开始进行预清理
  • 7.169: [GC (CMS Final Remark) 重新标记
  • 7.216: [CMS-concurrent-sweep-start] 开始并发清理
  • 7.222: [CMS-concurrent-reset-start] 开始并发重置状态
  • 其中 CMS-initial-mark阶段暂停线程0.0047161秒, CMS-concurrent-mark阶段暂停线程0.0465941秒, 因此两次暂停花费总时间是0.0513102秒少于200毫秒可以认为是正常范围
两种引起 Full GC的情况, Full GC时, 会暂停整个应用
  1. 日志信息 promotion failed
  • 年轻代空间不足, 从而把对象转移到老年代, 但是老年代也空间不足, 因此导致 Full GC.

- 13.649: [ParNew (promotion failed): 3107K->2674K(29504K), 0.0028597 secs] 35047K->35013K(62272K), 0.0029042 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 

  • 解决方法是简单讲就是把老年代或年轻代其中一个设大一些, 例 首先适当调年轻代和老年代比列后通过参数: -XX:SurvivorRatio调整空间比, 把 Survivor区设大些, 让对象尽量在 Survivor区呆长一点, 减少因年轻代空间不足进入老年代的对象, 减少老年代暴涨的可能性, 参数: -XX:SurvivorRatio默认值是8可以设置更小比如4, 如 设2的话是 Survivor区空间是 Eden区空间的的一半
  1. 日志信息 concurrent mode failure
  • 当正在进行 CMS收集时, 有对象从年轻代进入老年代, 但是老年代空间不足引起的

16.622: [CMS-concurrent-sweep-start]
16.622: [Full GC (GCLocker Initiated GC) 16.622: [CMS16.632: [CMS-concurrent-sweep: 0.010/0.010 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
 (concurrent mode failure): 32767K->32767K(32768K), 0.1232975 secs] 45351K->38398K(63744K), [Metaspace: 43769K->43769K(1087488K)], 0.1233561 secs] [Times: user=0.11 sys=0.00, real=0.12 secs] 

动态调试 JVM参数

  • 如正在运行中的 Java程序需要查看 GC日志等情况

1. 首先查出 pid
> C:\Program Files\Java\jdk1.8.0_121\bin>jps
16736 Launcher
17360 RemoteMavenServer
3568 ShopTestApp
4672
16472 Launcher
5640 Launcher
19388 Jps

2. 查看当前已开启的 Java程序的 JVM参数
> C:\Program Files\Java\jdk1.8.0_121\bin>jinfo 3568
...
...
VM Flags:
Non-default VM flags: -XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:CICompilerCount=3 -XX:InitialHeapSize=1073741824 -XX:InitialTenuringThreshold=7 -XX:+ManagementServer -XX:MaxHeapSize=1073741824 -XX:MaxNewSize=536870912 -XX:MaxTenuringThreshold=15 -XX:MinHeapDeltaBytes=524288 -XX:NewRatio=2 -XX:NewSize=536870912 -XX:OldSize=536870912 -XX:ParallelGCThreads=2 -XX:+PrintTenuringDistribution -XX:SurvivorRatio=8 -XX:ThreadStackSize=1024 -XX:TieredStopAtLevel=1 -XX:+UseAdaptiveSizePolicy -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC -XX:+UseParallelOldGC
Command line:  -Xms1024m -Xmx1024m -Xss1m -Xmn512m -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:+UseParallelGC -XX:ParallelGCThreads=2 -XX:+UseParallelOldGC -XX:+UseAdaptiveSizePolicy -XX:+PrintTenuringDistribution -XX:InitialTenuringThreshold=7 -XX:MaxTenuringThreshold=15 -XX:TieredStopAtLevel=1 -Xverify:none -Dspring.profiles.active=local -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=63465 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=localhost -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -javaagent:D:\download\IntelliJ IDEA 2018.1.1\lib\idea_rt.jar=63466:D:\download\IntelliJ IDEA 2018.1.1\bin -Dfile.encoding=UTF-8

3. 动态添加打印参数
- 打印指定 JVM的参数值: jinfo -flag <name> pid
- 设置指定 JVM参数的布尔值: jinfo -flag [+|-]<name> pid
- 设置指定 JVM参数的值: jinfo -flag <name>=<value> pid

> C:\Program Files\Java\jdk1.8.0_121\bin>jinfo -flag +PrintGC 3568
> C:\Program Files\Java\jdk1.8.0_121\bin>jinfo -flag +PrintGCDetails 3568

如果您觉得有帮助,欢迎点赞哦 ~ 谢谢!!

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值