JVM下篇(四、JVM运行时参数)

JVM_JVM运行时参数

提示: 本材料只做个人学习参考,不作为系统的学习流程,请注意识别!!!



四、JVM运行时参数

4.1 JVM参数选项类型

4.1.1 标准参数选项

  1. 特点:比较稳定,后续版本基本不会变化,以-开头。

  2. 各种选项,可以通过java命令查询帮助文档

在这里插入图片描述

  1. 补充

Hotspot JVM有两种模式,分别是server和client,分别通过-server和-client模式设置。

  • 在32位Windows操作系统上,默认使用Client类型的JVM。要想使用Server模式,则机器配置至少有2个以上的CPU和2G以上的物理内存。client模式只适用于对内存要求较小的桌面应用程序,默认使用Serial串行乐基收集器。
  • 64位机器上只支持server模式的JVM,适用于需要大内存的应用程序,默认使用并行垃圾收集器。

4.1.2 -X参数选项

  1. 特点

非标准化参数,功能还是比较稳定的,但官方说后续版本可能会变更,以-X开头。

  1. 各种选项,运行java -X命令可以查看所有的X选项

在这里插入图片描述

  1. JVM的JIT编译模式相关的选项
  • -Xint:禁用JIT,所有的字节码都被解释执行,这个模式的速度是最慢的。
  • -Xcomp:所有的字节码第一次使用就都要被编译成本地代码,然后再执行。
  • -Xmixed:混合模式,默认模式,合使用解释器+热点代码编译,起始阶段采用解释执行,同时对热点代码检测,进行编译执行。
  1. 特别的,-Xmx、-Xms、-Xss属于XX参数。
  • -Xms< size >:设置初始化java堆大小,等价于-XX:InitialHeapSize。
  • -Xmx< size >:设置最大java堆大小,等价于-XX:MaxHeapSize。
  • -Xss< size >:设置java线程堆栈大小,等价于-XX:ThreadStackSize。

4.1.3 -XX参数选项

  1. 特点:

非标准化参数,使用最多的参数类型,这类选项属于实验性,不确定,以-XX开头。

  1. 作用

用于开发和调试JVM

  1. 分类
  • Boolean类型格式

-XX:+< option > 表示启用option属性。
-XX:-< option > 表示禁用option属性。

举例:
-XX:+UseParallelGC 选择垃圾收集器为并行收集器
-XX:+UseG1GC 表示启用G1收集器
-XX:+UseAdaptiveSizePolicy 自动选择年轻代大小和Survivor区比例

说明:因为有的指令默认是开启的,可以选择-关闭。

  • Boolean类型格式(key-value类型)

子类型1:数值型格式-XX:< option >=< number >

number表示数值,可以带上单位,比如:m、M表示兆,k、K表示Kb等。

举例
-XX:NewSize=1024m 表示设置新生代初始化大小为1024兆
-XX:MaxGCPauseMillis=500 表示设置GC停顿时间500毫秒
-XX:GCTimeRatio=19 表示设置吞吐量
-XX:NewRatio=2 表示设置新生代和老年代的比例

子类型2:非数值型格式-XX:< option >=< String >

举例
-XX:HeapDumpPath=/usr/local/heapdump.hprof 用来指定heap转存文件的存储路径。

  1. 特别的

-XX:PrintFlagsFinal 输出所有参数的名称和默认值,默认不包括Diagnostic和Experimental的参数,可以配合-XX:+UnlockDiagnosticVMOptions和-XX:UnlockExperimentalVMOptions使用

4.2 添加JVM参数选项

  • Eclipse中添加: 略
  • Idea中添加: 略
  • 运行jar包:java -Xms50m … -jar demo.jar
  • 通过tomcat运行war包:

Linux系统可以在tomcat/bin/catalina.sh中添加类似如下配置
JAVA_OPTS=“-Xms512m -Xmx=512m”

  • 程序运行过程中:参考jinfo相关命令

4.3 常用的JVM参数选项

4.3.1 打印设置的XX选项及值

  • -XX:+PrintCommandLineFlags:可以让在程序运行前打印出用户手动设置或者JVM自动设置的XX选项
  • -XX:+PrintFlagsInitial:表示打印出所有XX选项的默认值
  • -XX:+PrintFlagsFinal:表示打印出XX选项在运行程序时生效的值
  • -XX:+PrintVMOptions:打印JVM的参数

4.3.2 堆、栈、方法区等内存大小设置

  • -Xss128k:设置每个线程的栈大小为128k,等价于-XX:ThreadStackSize=128k
  1. 堆内存
  • -Xms3350m:设置JVM初始化堆内存为3350M,等价于-XX:InitialHeapSize。
  • -Xmx3350m:设置JVM最大堆内存为3350M,等价于-XX:MaxHeapSize。
  • -Xmn2g:设置年轻代大小为2G,官方推荐配置为整个堆大小的3/8。
  • -XX:NewSize=1024m:设置年轻代初始化为1024M。
  • -XX:MaxNewSize=1024m:设置年轻代最大值为1024M。
  • -XX:SurvivorRatio=8:设置年轻代中Eden区与一个Survivor区的比值,默认为8。
  • -XX:+UseAdaptiveSizePolicy:自动选择各区大小比例
  • -XX:NewRatio=4:设置老年代与年轻代(包括一个Eden区和两个Survivor区)的比值。
  • -XX:PretenureSizeThreadshold=1024:设置让大于此阈值的对象直接分配到老年代,单位为字节,只对Serial、ParNew收集器有效。
  • -XX:MaxTenuringThreshold=15:默认为15,新生代每次MinorGC后,还存活的对象年龄+1,当对象的年龄大于设置的这个值时就进入老年代。
  • -XX:+PrintTenuringDistribution:让JVM在每次MinorGC后打印出当前使用的Survivor中对象的年龄分布。
  • -XX:TargetSurvivorRatio:表示MinorGC结束后Survivor区域中占用空间的期望比例。
  1. 方法区

永久代

  • -XX:PermSize=256m:设置永久代初始值为256M。
  • -XX:MaxPermSize=256m:设置永久代最大值为256M。

元空间

  • -XX:MetaspaceSize:初始空间大小。
  • -XX:MaxMetaspaceSize:最大空间,默认没有限制。
  • -XX:+UseCompressedOops:压缩对象指针。
  • -XX:+UseCompressedClassPointers:压缩类指针。
  • -XX:CompressedClassSpaceSize:设置Class Metaspace的大小,默认1G。
  1. 直接内存
  • -XX:MaxDirectMemorySize:指定直接内存容量,若未指定,则默认与Java堆最大值一样。

4.3.3 OutOfMemory相关的选项

  • -XX:+HeapDumpOnOutOfMemoryError:表示在内存出现OOM的时候,把Heap转存(Dump)到文件以便后续分析。
  • -XX:+HeapDumpBeforeFullGC:表示在出现fullGC之前,生成Dump转存文件。
  • -XX:HeapDumpPath=< path >:指定heap转存文件的存储路径。
  • -XX:OnOutOfMemoryError:指定一个可行性程序或者脚本的路径,当发生OOM的时候,去执行这个脚本。

对OnOutOfMemoryError的运维处理,以部署在Linux系统的/opt/server目录下的Server.jar为例。

  1. 在run.sh启动脚本中添加jvm参数:
    -XX:OnOutOfMemoryError=/opt/server/restart.sh
  2. linux中的restart.sh脚本
#!/bin/bash
pid=$(ps -ef | grep Server.jar | awk '{if($8=="java") {print $2}}')
kill -9 $pid
cd /opt/server/;
sh run.sh

4.3.4 垃圾收集器相关选项

垃圾回收器回顾

在这里插入图片描述

  • 红色虚线表示在 jdk8 时被 Deprecate,jdk9 时被删除
  • 绿色虚线表示在 jdk14 时被 Deprecate
  • 绿色虚框表示在 jdk9 时被 Deprecate,jdk14 时被删除
  1. 查看默认垃圾收集器
  • -XX:+PrintCommandLineFlags:查看命令行相关参数(包含使用的垃圾收集器)

  • 使用命令行指令: jinfo -flag 垃圾回收器参数 pid

以上两种方式都可以查看默认使用的垃圾回收器,第1种方式更加直观,但是需要程序的支持;第2种方式需要去尝试,如果使用了,返回的值中有+号,否则就是-号。

  1. Serial回收器
  • -XX:+UseSerialGC:指定年轻代和老年代都使用串行收集器。等价于新生代用Serial GC,且老年代用Serial Old GC,可以获得最高的单线程收集效率。

Serial收集器作为HotSpot中Client模式下的默认新生代垃圾收集器。Serial old是运行在Client模式下默认的老年代的垃圾回收器。

  1. ParNew回收器
  • -XX:+UseParNewGC:手动指定使用ParNew收集器执行内存回收任务。它表示年轻代使用并行收集器,不影响老年代。
  • -XX:ParallelGCThreads=N:设置年轻代并行收集器的线程数。一般地,最好与CPU数量相等,以避免过多的线程数影响垃圾收集性能。在默认情况下,当CPU数量小于8个,ParallelGCThreads的值等于CPU数量。当CPU数量大于8个,ParallelGCThreads的值等于3+[5*CPU Count]/8]
  1. Parallel回收器
  • -XX:+UseParallelGC:手动指定年轻代使用Parallel并行收集需执行内存回收任务。
  • -XX:+UseParallelOldGC:手动指定老年代都是使用并行回收收集器。
    • 分别适用于新生代和老年代。默认jdk8是开启的。
    • 上面两个参数,默认开启一个,另一个也会被开启。(互相激活)
  • -XX:ParallelGCThreads:设置年轻代并行收集器的线程数。一般地,最好与CPU数量相等,以避免过多的线程数影响垃圾收集性能
    • 在默认情况下,当CPU数量小于8个,ParallelGCThreads的值等于CPU数量。
    • 当CPU数量大于8个,ParallelGCThreads的值等于3+[5*CPU_Count]/8]。
  • -XX:MaxGCPauseMillis:设置垃圾收集器最大停顿时间(即STW的时间),单位是毫秒。
    • 为了尽可能地把停顿时间控制在MaxGCPauseMills以内,收集器在工作时会调整Java堆大小或者其他一些参数。
    • 对于用户来讲,停顿时间越短体验越好。但是在服务器端,我们注重高并发,整体的吞吐量。所以服务器端适合Parallel,进行控制。
    • 该参数使用需谨慎。
  • -XX:GCTimeRatio:垃圾收集时间占总时间的比例(= 1/(N + 1)),用于衡量吞吐量的大小。
    • 取值范围(0,100),默认值99,也就是垃圾回收时间不超过1%
    • 与前一个-XX:MaxGCPauseMills参数有一定矛盾性。暂停时间越长,Radio参数就容易超过设定的比例。
  • -XX:+UseAdaptiveSizePolicy:设置Parallel Scavenge收集器具有自适应调节策略
    • 在这种模式下,年轻代的大小、Eden和Survivor的比例、晋升老年代的对象年龄等参数会被自动调整,已达到在堆大小、吞吐量和停顿时间之间的平衡点。
    • 在手动调优比较困难的场合,可以直接使用这种自适应的方式,仅指定虚拟机的最大堆、目标的吞吐量(GCTimeRatio)和停顿时间(MaxGCPauseMills),让虚拟机自己完成调优工作。

小结

Parallel回收器主打吞吐量,而CMS和G1主打低延迟,如果主打吞吐量,那么就不应该限制最大停顿时间,所以-XX:MaxGCPauseMills不应该设置。

-XX:MaxGCPauseMills中的调整堆大小通过默认开启的-XX:+UseAdaptiveSizePolicy来实现。
-XX:GCTimeRatio用来衡量吞吐量,并且和-XX:MaxGCPauseMills矛盾,因此不会同时使用。

  1. CMS回收器
  • -XX:+UseConcMarkSweepGC:手动指定使用CMS收集器执行内存回收任务。

    • 开启该参数后会自动将-XX:+UseParNewGC打开。即:ParNew(Young区用)+CMS(Old区用)
      +Serial Old的组合。(cms收集器收集old区,垃圾太多的话,会启动Serial Old来收集,因为串行收集)
  • -XX:CMSInitiatingOccupanyFraction:设置堆内存使用率的阈值,一旦达到该阈值,便开始进回收。

    • JDK5及以前版本的默认值为68,即当老年代的空间使用率达到68%时,会执行一次CMS回收。JDK6及以上版本默认值为92%
    • 如果内存增长缓慢,则可以设置一个稍大的值,大的阈值可以有效降低CMS的触发频率,减少老年代回收的次数可以较为明显地改善应用程序性能。反之,如果应用程序内存使用率增长很快,则应该降低这个阈值,以避免频繁触发老年代串行收集器。因此通过该选项便可以有效降低Full GC的执行次数。
  • -XX:+UseCMSCompactAtFullCollection:用于指定在执行完Full GC后对内存空间进行压缩整理以此避免内存碎片的产生。不过由于内存压缩整理过程无法并发执行,所带来的问题就是停顿时间变得更长了。

  • -XX:CMSFullGCsBeforeCompaction:设置在执行多少次Full GC后对内存空间进行压缩整理。

  • -XX:ParallelCMSThreads:设置CMS的线程数量。

  • CMS默认启动的线程数是(ParallelGCThreads+3)/4,ParallelGCThreads是年轻代并行收集器的线程数。当CPU资源比较紧张时,受到CMS收集器线程的影响,应用程序的性能在垃圾回收阶段可能会非常糟糕。

补充参数

  • -XX:ConcGCThreads:设置并发垃圾收集的线程数,默认该值是基于ParallelGCThreads算出来的。
  • -XX:+UseCMSInitiatingOccupancyOnly:是否动态可调,用这个参数可以使CMS一直按CMSInitiatingOccupancyFraction设定的值启动。
  • -XX:+CMSScavengeBeforeRemark:强制hotspot虚拟机在cms remark阶段之前做一次minor gc。用于提高remark阶段的速度。
  • -XX:+CMSClassUnloadingEnable:如果有的话,启用回收Perm区(JDK8之前)。
  • -XX:+CMSParallelInitialEnabled:用于开启CMS initial-mark阶段采用多线程的方式进行标记,用于提高标记速度,在Java8开始已经默认开启。
  • -XX:+CMSParallelRemarkEnabled:用户开启CMS remark阶段采用多线程的方式进行重新标记,默认开启。
  • -XX:+ExplicitGCInvokesConcurrent、-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses:这两个参数用户指定hotspot虚拟在执行System.gc()时使用CMS周期。
  • -XX:+CMSPrecleaningEnabled:指定CMS是否需要进行Pre cleaning这个阶段
  1. G1回收器
  • -XX:+UseG1GC:手动指定使用G1收集器执行内存回收任务。
  • -XX:G1HeapRegionSize:设置每个Region的大小。值是2的幂,范围是1MB到32MB之间,目标是根据最小的Java堆大小划分出约2048个区域。默认是堆内存的1/2000。
  • -XX:MaxGCPauseMillis:设置期望达到的最大GC停顿时间指标(JVM会尽力实现,但不保证达到)。默认值是200ms。
  • -XX:ParallelGCThread:设置STW时GC线程数的值。最多设置为8。
  • -XX:ConcGCThreads:设置并发标记的线程数。将n设置为并行垃圾回收线程数(ParallelGCThreads)的1/4左右。
  • -XX:InitiatingHeapOccupancyPercent:设置触发并发GC周期的Java堆占用率阈值。超过此值,就触发GC。默认值是45。
  • -XX:G1NewSizePercent、-XX:G1MaxNewSizePercent:新生代占用整个堆内存的最小百分比(默认5%)、最大百分比(默认60%)。
  • -XX:G1ReservePercent=10:保留内存区域,防止to space(Survivor中的to区)溢出。

如果使用G1垃圾收集器,不建议设置-Xmn和-XX:NewRatio,毕竟可能影响G1的自动调节

Mixed GC调优参数

  • -XX:InitiatingHeapOccupancyPercent:设置堆占用率的百分比(0到100)达到这个数值的时候触发global concurrent marking(全局并发标记),默认为45%。值为0表示间断进行全局并发标记。
  • -XX:G1MixedGCLiveThresholdPercent:设置old区的region被回收时候的对象占比,默认占用率为85%,只有Old区的region中存活的对象占用达到了这个百分比,才会在Mixed GC中被回收。
  • -XX:G1HeapWastePercent:在global concurrent marking(全局并发标记),结束之后,可以知道所有的区有多少空间要被回收,在每次young GC之后和再次发生Mixed GC之前,会检查垃圾占比是否达到此参数,只有达到了,下次才会发生Mixed GC。
  • -XX:G1MixedGCCountTarget:一次global concurrent marking(全局并发标记)之后,最多执行Mixed GC的次数,默认是8。
  • -XX:G1OldCSetRegionThresholdPercent:设置Mixed GC收集周期中要收集的Old region数的上限。默认值是Java堆的10%。
  1. 怎么选择垃圾回收器
  • 优先让 JVM 自适应,调整堆的大小。
  • 串行收集器:内存小于 100M;单核、单机程序,并且没有停顿时间的要求。
  • 并行收集器:多 CPU、高吞吐量、允许停顿时间超过 1 秒。
  • 并发收集器:多 CPU、追求低停顿时间、快速响应(比如延迟不能超过 1 秒,如互联网应用)
    官方推荐 G1,性能高。现在互联网的项目,基本都是使用 G1。

4.3.5 GC日志相关选项

常用参数

  • -XX:+PrintGC 等价于-verbose:gc 打印简要日志信息
  • -XX:+PrintGCDetails 在发生垃圾回收时打印内存回收详细的日志,并在进程退出时输出当前内存各区域的分配情况
  • -XX:+PrintGCTimeStamps 打印程序启动到GC发生的时间,搭配-XX:+PrintGCDetails使用
  • -XX:+PrintGCDateStamps 打印GC发生时的时间戳,搭配-XX:+PrintGCDetails使用
  • -XX:+PrintHeapAtGC 每一次GC前和GC后,都打印堆信息
  • -Xloggc:< file > 把GC日志写入到一个文件中去,而不是打印到标准输出中

-XX:+PrintGCDetails包含了 -XX:+PrintGC

######################## -XX:+PrintGC 或者  -verbose:gc #################################
[GC (Allocation Failure)  15335K->13461K(58880K), 0.0039121 secs]
[GC (Allocation Failure)  28752K->28672K(58880K), 0.0142382 secs]
[Full GC (Ergonomics)  28672K->28553K(58880K), 0.0196018 secs]
[Full GC (Ergonomics)  43856K->43456K(58880K), 0.0167212 secs]



######################## -XX:+PrintGCDetails #################################

[GC (Allocation Failure) [PSYoungGen: 15335K->2548K(17920K)] 15335K->13458K(58880K), 0.0200941 secs] [Times: user=0.01 sys=0.02, real=0.02 secs] 
[GC (Allocation Failure) [PSYoungGen: 17838K->2536K(17920K)] 28748K->28644K(58880K), 0.0053322 secs] [Times: user=0.03 sys=0.03, real=0.01 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2536K->0K(17920K)] [ParOldGen: 26108K->28554K(40960K)] 28644K->28554K(58880K), [Metaspace: 3727K->3727K(1056768K)], 0.0095833 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[Full GC (Ergonomics) [PSYoungGen: 15296K->3000K(17920K)] [ParOldGen: 28554K->40756K(40960K)] 43850K->43756K(58880K), [Metaspace: 3727K->3727K(1056768K)], 0.0188909 secs] [Times: user=0.08 sys=0.00, real=0.02 secs] 
Heap
 PSYoungGen      total 17920K, used 10758K [0x00000000fec00000, 0x0000000100000000, 0x0000000100000000)
  eden space 15360K, 70% used [0x00000000fec00000,0x00000000ff681a28,0x00000000ffb00000)
  from space 2560K, 0% used [0x00000000ffd80000,0x00000000ffd80000,0x0000000100000000)
  to   space 2560K, 0% used [0x00000000ffb00000,0x00000000ffb00000,0x00000000ffd80000)
 ParOldGen       total 40960K, used 40756K [0x00000000fc400000, 0x00000000fec00000, 0x00000000fec00000)
  object space 40960K, 99% used [0x00000000fc400000,0x00000000febcd010,0x00000000fec00000)
 Metaspace       used 3734K, capacity 4536K, committed 4864K, reserved 1056768K
  class space    used 410K, capacity 428K, committed 512K, reserved 1048576K


######################## -XX:+PrintGCDetails -XX:+PrintGCTimeStamps #################################
2.769: [GC (Allocation Failure) [PSYoungGen: 15335K->2544K(17920K)] 15335K->13421K(58880K), 0.0046001 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
5.895: [GC (Allocation Failure) [PSYoungGen: 17834K->2540K(17920K)] 28712K->28664K(58880K), 0.0046225 secs] [Times: user=0.02 sys=0.05, real=0.00 secs] 
5.900: [Full GC (Ergonomics) [PSYoungGen: 2540K->0K(17920K)] [ParOldGen: 26124K->28553K(40960K)] 28664K->28553K(58880K), [Metaspace: 3733K->3733K(1056768K)], 0.0091404 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
8.966: [Full GC (Ergonomics) [PSYoungGen: 15303K->2500K(17920K)] [ParOldGen: 28553K->40955K(40960K)] 43856K->43456K(58880K), [Metaspace: 3733K->3733K(1056768K)], 0.0061868 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
Heap
 PSYoungGen      total 17920K, used 10249K [0x00000000fec00000, 0x0000000100000000, 0x0000000100000000)
  eden space 15360K, 66% used [0x00000000fec00000,0x00000000ff602488,0x00000000ffb00000)
  from space 2560K, 0% used [0x00000000ffd80000,0x00000000ffd80000,0x0000000100000000)
  to   space 2560K, 0% used [0x00000000ffb00000,0x00000000ffb00000,0x00000000ffd80000)
 ParOldGen       total 40960K, used 40955K [0x00000000fc400000, 0x00000000fec00000, 0x00000000fec00000)
  object space 40960K, 99% used [0x00000000fc400000,0x00000000febfef80,0x00000000fec00000)
 Metaspace       used 3739K, capacity 4536K, committed 4864K, reserved 1056768K
  class space    used 410K, capacity 428K, committed 512K, reserved 1048576K


######################## -XX:+PrintHeapAtGC #################################
  {Heap before GC invocations=1 (full 0):
 PSYoungGen      total 17920K, used 15335K [0x00000000fec00000, 0x0000000100000000, 0x0000000100000000)
  eden space 15360K, 99% used [0x00000000fec00000,0x00000000ffaf9e20,0x00000000ffb00000)
  from space 2560K, 0% used [0x00000000ffd80000,0x00000000ffd80000,0x0000000100000000)
  to   space 2560K, 0% used [0x00000000ffb00000,0x00000000ffb00000,0x00000000ffd80000)
 ParOldGen       total 40960K, used 0K [0x00000000fc400000, 0x00000000fec00000, 0x00000000fec00000)
  object space 40960K, 0% used [0x00000000fc400000,0x00000000fc400000,0x00000000fec00000)
 Metaspace       used 3725K, capacity 4536K, committed 4864K, reserved 1056768K
  class space    used 409K, capacity 428K, committed 512K, reserved 1048576K
Heap after GC invocations=1 (full 0):
 PSYoungGen      total 17920K, used 2532K [0x00000000fec00000, 0x0000000100000000, 0x0000000100000000)
  eden space 15360K, 0% used [0x00000000fec00000,0x00000000fec00000,0x00000000ffb00000)
  from space 2560K, 98% used [0x00000000ffb00000,0x00000000ffd79140,0x00000000ffd80000)
  to   space 2560K, 0% used [0x00000000ffd80000,0x00000000ffd80000,0x0000000100000000)
 ParOldGen       total 40960K, used 10897K [0x00000000fc400000, 0x00000000fec00000, 0x00000000fec00000)
  object space 40960K, 26% used [0x00000000fc400000,0x00000000fcea46a0,0x00000000fec00000)
 Metaspace       used 3725K, capacity 4536K, committed 4864K, reserved 1056768K
  class space    used 409K, capacity 428K, committed 512K, reserved 1048576K
}
{Heap before GC invocations=2 (full 0):
 PSYoungGen      total 17920K, used 17822K [0x00000000fec00000, 0x0000000100000000, 0x0000000100000000)
  eden space 15360K, 99% used [0x00000000fec00000,0x00000000ffaeea58,0x00000000ffb00000)
  from space 2560K, 98% used [0x00000000ffb00000,0x00000000ffd79140,0x00000000ffd80000)
  to   space 2560K, 0% used [0x00000000ffd80000,0x00000000ffd80000,0x0000000100000000)
 ParOldGen       total 40960K, used 10897K [0x00000000fc400000, 0x00000000fec00000, 0x00000000fec00000)
  object space 40960K, 26% used [0x00000000fc400000,0x00000000fcea46a0,0x00000000fec00000)
 Metaspace       used 3726K, capacity 4536K, committed 4864K, reserved 1056768K
  class space    used 409K, capacity 428K, committed 512K, reserved 1048576K
Heap after GC invocations=2 (full 0):
 PSYoungGen      total 17920K, used 2532K [0x00000000fec00000, 0x0000000100000000, 0x0000000100000000)
  eden space 15360K, 0% used [0x00000000fec00000,0x00000000fec00000,0x00000000ffb00000)
  from space 2560K, 98% used [0x00000000ffd80000,0x00000000ffff9160,0x0000000100000000)
  to   space 2560K, 0% used [0x00000000ffb00000,0x00000000ffb00000,0x00000000ffd80000)
 ParOldGen       total 40960K, used 26108K [0x00000000fc400000, 0x00000000fec00000, 0x00000000fec00000)
  object space 40960K, 63% used [0x00000000fc400000,0x00000000fdd7f020,0x00000000fec00000)
 Metaspace       used 3726K, capacity 4536K, committed 4864K, reserved 1056768K
  class space    used 409K, capacity 428K, committed 512K, reserved 1048576K
}
{Heap before GC invocations=3 (full 1):
 PSYoungGen      total 17920K, used 2532K [0x00000000fec00000, 0x0000000100000000, 0x0000000100000000)
  eden space 15360K, 0% used [0x00000000fec00000,0x00000000fec00000,0x00000000ffb00000)
  from space 2560K, 98% used [0x00000000ffd80000,0x00000000ffff9160,0x0000000100000000)
  to   space 2560K, 0% used [0x00000000ffb00000,0x00000000ffb00000,0x00000000ffd80000)
 ParOldGen       total 40960K, used 26108K [0x00000000fc400000, 0x00000000fec00000, 0x00000000fec00000)
  object space 40960K, 63% used [0x00000000fc400000,0x00000000fdd7f020,0x00000000fec00000)
 Metaspace       used 3726K, capacity 4536K, committed 4864K, reserved 1056768K
  class space    used 409K, capacity 428K, committed 512K, reserved 1048576K
Heap after GC invocations=3 (full 1):
 PSYoungGen      total 17920K, used 0K [0x00000000fec00000, 0x0000000100000000, 0x0000000100000000)
  eden space 15360K, 0% used [0x00000000fec00000,0x00000000fec00000,0x00000000ffb00000)
  from space 2560K, 0% used [0x00000000ffd80000,0x00000000ffd80000,0x0000000100000000)
  to   space 2560K, 0% used [0x00000000ffb00000,0x00000000ffb00000,0x00000000ffd80000)
 ParOldGen       total 40960K, used 28553K [0x00000000fc400000, 0x00000000fec00000, 0x00000000fec00000)
  object space 40960K, 69% used [0x00000000fc400000,0x00000000fdfe2588,0x00000000fec00000)
 Metaspace       used 3726K, capacity 4536K, committed 4864K, reserved 1056768K
  class space    used 409K, capacity 428K, committed 512K, reserved 1048576K
}
{Heap before GC invocations=4 (full 2):
 PSYoungGen      total 17920K, used 15303K [0x00000000fec00000, 0x0000000100000000, 0x0000000100000000)
  eden space 15360K, 99% used [0x00000000fec00000,0x00000000ffaf1dc0,0x00000000ffb00000)
  from space 2560K, 0% used [0x00000000ffd80000,0x00000000ffd80000,0x0000000100000000)
  to   space 2560K, 0% used [0x00000000ffb00000,0x00000000ffb00000,0x00000000ffd80000)
 ParOldGen       total 40960K, used 28553K [0x00000000fc400000, 0x00000000fec00000, 0x00000000fec00000)
  object space 40960K, 69% used [0x00000000fc400000,0x00000000fdfe2588,0x00000000fec00000)
 Metaspace       used 3726K, capacity 4536K, committed 4864K, reserved 1056768K
  class space    used 409K, capacity 428K, committed 512K, reserved 1048576K
Heap after GC invocations=4 (full 2):
 PSYoungGen      total 17920K, used 2500K [0x00000000fec00000, 0x0000000100000000, 0x0000000100000000)
  eden space 15360K, 16% used [0x00000000fec00000,0x00000000fee71190,0x00000000ffb00000)
  from space 2560K, 0% used [0x00000000ffd80000,0x00000000ffd80000,0x0000000100000000)
  to   space 2560K, 0% used [0x00000000ffb00000,0x00000000ffb00000,0x00000000ffd80000)
 ParOldGen       total 40960K, used 40955K [0x00000000fc400000, 0x00000000fec00000, 0x00000000fec00000)
  object space 40960K, 99% used [0x00000000fc400000,0x00000000febfef50,0x00000000fec00000)
 Metaspace       used 3726K, capacity 4536K, committed 4864K, reserved 1056768K
  class space    used 409K, capacity 428K, committed 512K, reserved 1048576K
}

其他参数

  • -XX:+TraceClassLoading 监控类的加载
  • -XX:+PrintGCApplicationStoppedTime 打印GC时线程的停顿时间
  • -XX:+PrintGCApplicationConcurrentTime 打印垃圾收集之前应用未中断的执行时间
  • -XX:+PrintReferenceGC 打印回收了多少种不同引用类型的引用
  • -XX:+PrintTenuringDistribution 让JVM在每次MinorGC后打印出当前使用的Survivor中对象的年龄分布
  • -XX:+UseGCLogFileRotation 启用GC日志文件的自动转储
  • -XX:NumberOfGCLogFiles=1 设置GC日志文件的循环数目
  • -XX:GCLogFileSize=1M 设置GC日志文件的大小

4.3.6 其他参数

  • -XX:+DisableExplicitGC 禁用hotspot执行System.gc(),默认禁用
  • -XX:ReservedCodeCacheSize=[g|m|k]、-XX:InitialCodeCacheSize=[g|m|k] 指定代码缓存的大小
  • -XX:+UseCodeCacheFlushing 使用该参数让jvm放弃一些被编译的代码,避免代码缓存被占满时JVM切换到interpreted-only的情况
  • -XX:+DoEscapeAnalysis 开启逃逸分析
  • -XX:+UseBiasedLocking 开启偏向锁
  • -XX:+UseLargePages 开启使用大页面
  • -XX:+PrintTLAB 打印TLAB的使用情况
  • -XX:TLABSize 设置TLAB大小

4.4 通过Java代码获取JVM参数

public class MemoryMonitor {
    public static void main(String[] args) {
        MemoryMXBean memorymbean = ManagementFactory.getMemoryMXBean();
        MemoryUsage usage = memorymbean.getHeapMemoryUsage();
        System.out.println("INIT HEAP: " + usage.getInit() / 1024 / 1024 + "m");
        System.out.println("MAX HEAP: " + usage.getMax() / 1024 / 1024 + "m");
        System.out.println("USE HEAP: " + usage.getUsed() / 1024 / 1024 + "m");
        System.out.println("\nFull Information:");
        System.out.println("Heap Memory Usage: " + memorymbean.getHeapMemoryUsage());
        System.out.println("Non-Heap Memory Usage: " + memorymbean.getNonHeapMemoryUsage());

        System.out.println("=======================通过java来获取相关系统状态============================ ");
        System.out.println("当前堆内存大小totalMemory " + (int) Runtime.getRuntime().totalMemory() / 1024 / 1024 + "m");// 当前堆内存大小
        System.out.println("空闲堆内存大小freeMemory " + (int) Runtime.getRuntime().freeMemory() / 1024 / 1024 + "m");// 空闲堆内存大小
        System.out.println("最大可用总堆内存maxMemory " + Runtime.getRuntime().maxMemory() / 1024 / 1024 + "m");// 最大可用总堆内存大小

    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值