• 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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119

    其他参数

    • -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");// 最大可用总堆内存大小
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    ShardingSphere-JDBC使用笔记
    pthread_mutex_t & pthread_cond_t 总结
    搜索关键词标红组件
    【C语言从0到1之指针】(详解,赶紧收藏期末考试备用)
    功能型饮料到底是好还是坏,这大概是最中肯的回答了
    【树状数组该回炉重造了】Codeforces Round #813 (Div. 2) E2. LCM Sum (hard version)
    【SpringBoot】SpringBoot自定义banner,成千上万种可供选择,当然也可以自定义生成哦
    软考 -结构化开发
    【毕业设计】基于javaEE+SSH+SqlServer的企业车辆管理系统设计与实现(毕业论文+程序源码)——车辆管理系统
    《Spring Security 简易速速上手小册》第7章 REST API 与微服务安全(2024 最新版)
  • 原文地址:https://blog.csdn.net/weixin_43695916/article/details/127087882