您好,欢迎来到世旅网。
搜索
您的当前位置:首页JVM常用调优及监控指令

JVM常用调优及监控指令

来源:世旅网


1.JVM参数

1.1.标准参数

1.2.-X参数

可能会随着版本变更移除,在标准参数的基础上进行扩展的参数。

1.3.-XX参数 

-XX表示的非Stable参数,可能随时取消, Hotspot 中主要的参数大致分为3类

  • 性能参数(Performance Options):用于JVM的性能调优和内存分配控制,如初始化内存大小的设置;
  • 行为参数(Behavioral Options):用于改变JVM的基础行为,如GC的方式和算法的选择;
  • 调试参数(Debugging Options):用于监控、打印、输出等jvm参数,用于显示jvm更加详细的信息;

使用方法:
-XX:+ 启用选项

-XX:- 关闭选项

-XX:= 给选项设置一个数字类型值,可跟单位,例如 32k, 1024m, 2g

-XX:= 给选项设置一个字符串值,例如-XX:HeapDumpPath=./dump.core

1.3.1.性能参数

        性能参数往往用来定义内存分配的大小和比例,相比于行为参数和调试参数,一个比较明显的区别是性能参数后面往往跟的有数值,常用如下:

jvm调优参数
参数及其默认值描述
-Xms100M-XX:InitialHeapSize=100M 堆的初始化大小
-Xmx100M-XX:MaxHeapSize=100M 堆的最大内存
-Xss100k-XX:ThreadStackSize=100k 虚拟机栈的大小 默认是1m
-XX:NewSize=2.125m新生代初始内存的大小
-XX:MaxNewSize=size新生代最大内存大小
-XX:MaxPermSize=m非最大值(jdk 8.0已移除)
-XX:PermSize=m

非初始值(jdk 8.0已移除)

-XX:MetaspaceSize=21m初始化元空间大小,位服务器默认约为21m
-XX:MaxMetaspaceSize=21m最大元空间大小,默认没有
-XX:MaxTenuringThreshold=15对象在新生代存活区切换的次数(坚持过MinorGC的次数,每坚持过一次,该值就增加1),大于该值会进入老年代(年龄阈值)
-XX:MaxHeapFreeRatio=70GC后java堆中空闲量占的最大比例,大于该值,则堆内存会减少
-XX:MinHeapFreeRatio=40GC后java堆中空闲量占的最小比例,小于该值,则堆内存会增加
-XX:NewRatio=2新生代内存容量与老生代内存容量的比例,设置的是老年代
-XX:ReservedCodeCacheSize= 32m保留代码占用的内存容量
-XX:ThreadStackSize=512K设置线程栈大小,若为0则使用系统默认值
-XX:LargePageSizeInBytes=4m设置用于Java堆的大页面尺寸
-XX:PretenureSizeThreshold=100000000大于该值的对象直接晋升入老年代(这种对象少用为好)
-XX:SurvivorRatio=8Eden区域Survivor区的容量比值,如默认值为8,代表Eden:Survivor1:Survivor2=8:1:1

1.3.2.行为参数

        行为参数主要用来选择使用垃圾收集器组合,以及控制运行过程中的GC策略等

jvm调优参数
参数及其默认值描述
-XX:+UseSerialGC启用串行GC,即采用Serial+Serial Old模式
-XX:+UseParNewGC使用ParNew+Serial Old收集器组合
-XX:+UseParallelGC启用并行GC,即采用Parallel Scavenge+Serial Old收集器组合(-Server模式下的默认组合)
-XX:GCTimeRatio=99设置用户执行时间占总时间的比例(默认值99,即1%的时间用于GC)
-XX:MaxGCPauseMillis=time设置GC的最大停顿时间(这个参数只对Parallel Scavenge有效)(JVM会尽力实现,但不保证达到)
-XX:ParallelGCThreads
设置年轻代线程数(当cpu合数小于等于8,默认cpu核数相同; 当cpu核数超过8, ParllGCThreads设置为 3+(5*CPU_COUNT)/8)
-XX:+UseParallelOldGC使用Parallel Scavenge +Parallel Old组合收集器
-XX:+UseConcMarkSweepGC使用ParNew+CMS+Serial Old组合并发收集,优先使用ParNew+CMS,当用户线程内存不足时,采用备用方案Serial Old收集。
-XX:-DisableExplicitGC禁止调用System.gc();但jvm的gc仍然有效
-XX:+ScavengeBeforeFullGC新生代GC优先于Full GC执行
-XX:+UseG1GC使用 G1 垃圾收集器
-XX:InitiatingHeapOccupancyPercent=45mixed gc中也有一个阈值参数 ,当老年代大小占整个堆大小百分比达到该阈值时,会触发一次mixed gc. 默认值为 45
-XX:ConcGCThreads=n并发垃圾收集器使用的线程数量. 默认值随JVM运行的平台不同而不同
-XX:G1ReservePercent=n设置堆内存保留为假天花板的总量,以降低提升失败的可能性. 默认值是 10
-XX:G1HeapRegionSize=n使用G1时Java堆会被分为大小统一的的区(region)。此参数可以指定每个heap区的大小. 默认值将据 heap size 算出最优解. 最小值为 1Mb, 最大值为 32Mb.

1.3.3.调试参数

        调试参数,主要用于监控和打印GC的信息

jvm调优参数
参数及其默认值描述
-XX:-CITime打印消耗在JIT编译的时间
-XX:ErrorFile=./hs_err_pid.log保存错误日志或者数据到文件中
-XX:-ExtendedDTraceProbes开启solaris特有的dtrace探针
-XX:HeapDumpPath=./java_pid.hprof指定导出堆信息时的路径或文件名
-XX:-HeapDumpOnOutOfMemoryError当首次遭遇OOM时导出此时堆中相关信息
-XX:OnError=“;”出现致命ERROR之后运行自定义命令
-XX:OnOutOfMemoryError=“;”当首次遭遇OOM时执行自定义命令
-XX:-PrintClassHistogram遇到Ctrl-Break打印类实例的柱状信息,与jmap -histo功能相同
-XX:-PrintConcurrentLocks遇到Ctrl-Break打印并发锁的相关信息,与jstack -l功能相同
-XX:-PrintCommandLineFlags打印在命令行中出现过的标记
-XX:-PrintCompilation当一个方法被编译时打印相关信息
-XX:-PrintGC每次GC时打印相关信息
-XX:-PrintGC Details每次GC时打印详细信息
-XX:-PrintGCTimeStamps打印每次GC的时间戳
-XX:-TraceClassLoading跟踪类的加载信息
-XX:-TraceClassLoadingPreorder跟踪被引用到的所有类的加载信息
-XX:-TraceClassResolution跟踪常量池
-XX:-TraceClassUnloading跟踪类的卸载信息
-XX:-TraceLoaderConstraints跟踪类加载器约束的相关信息

2.JVM监控指令

2.1.jps

jps 是(java process Status Tool), Java版的ps命令,查看java进程及其相关的信息,如果想找到一个java进程的pid,那可以用jps命令替代linux中的ps命令了,简单而方便。

命令格式:jps [options] [hostid]

options参数解释: 

  • -l : 显示进程id,显示主类全名或jar路径
  • -q : 显示进程id
  • -m : 显示进程id, 显示JVM启动时传递给main()的参数
  • -v : 显示进程id,显示JVM启动时显示指定的JVM参数

hostid : 主机或其他服务器ip

常用示例:

  • jps -l 输出jar包路径,类全名
  • jps -m 输出main参数
  • jps -v 输出JVM参数

2.2.jinfo

jinfo是用来查看JVM参数和动态修改部分JVM参数的命令

命令执行异常参考:

命令格式:jinfo [options] <pid>

options参数解释: 

  • no options 输出所有的系统属性和参数
  • -flag 打印指定名称的参数
  • -flag [+|-] 打开或关闭参数
  • -flag = 设置参数
  • -flags 打印所有参数
  • -sysprops 打印系统配置

pid : 进程号

常用示例:

查看JVM参数和系统配置

jinfo 11666

jinfo -flags 11666

jinfo -sysprops 11666

查看打印GC日志参数

jinfo -flag PrintGC 11666

jinfo -flag PrintGCDetails 11666

打开GC日志参数

jinfo -flag +PrintGC 11666

jinfo -flag +PrintGCDetails 11666

关闭GC日志参数

jinfo -flag -PrintGC 11666

jinfo -flag -PrintGCDetails 11666

jinfo支持修改的参数: 

window:   java -XX:PrintFlagsFinal -version | findstr manageable

Linux:      java -XX:PrintFlagsFinal -version | grep manageable

2.3.jstat

jstat命令是使用频率比较高的命令,主要用来查看JVM运行时的状态信息,包括内存状态、垃圾回收等 

命令格式:jstat  [options] VMID [interval] [count]

options参数解释:

  • -class class loader的行为统计
  • -compiler HotSpt JIT编译器行为统计
  • -gc 垃圾回收堆的行为统计
  • -gccapacity 各个垃圾回收代容量(young,old,perm)和他们相应的空间统计
  • -gcutil 垃圾回收统计概述
  • -gccause 垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因
  • -gcnew 新生代行为统计
  • -gcnewcapacity 新生代与其相应的内存空间的统计
  • -gcold 年老代和永生代行为统计
  • -gcoldcapacity 年老代行为统计
  • -printcompilation HotSpot编译方法统计 

常用示例及打印字段解释:

jstat -gcutil 11666 1000 3

11666为pid,每隔1000毫秒打印一次,打印3次 

字段解释:

  • S0 survivor0使用百分比
  • S1 survivor1使用百分比
  • E Eden区使用百分比
  • O 老年代使用百分比
  • M 元数据区使用百分比
  • CCS 压缩使用百分比
  • YGC 年轻代垃圾回收次数
  • YGCT 年轻代垃圾回收消耗时间
  • FGC Full GC垃圾回收次数
  • FGCT Full GC垃圾回收消耗时间
  • GCT 垃圾回收消耗总时间

jstat -gc 11666 1000 3  

 -gc和-gcutil参数类似,只不过输出字段不是百分比,而是实际的值。

 字段解释:

  • S0C survivor0大小
  • S1C survivor1大小
  • S0U survivor0已使用大小
  • S1U survivor1已使用大小
  • EC Eden区大小
  • EU Eden区已使用大小
  • OC 老年代大小
  • OU 老年代已使用大小
  • MC 方法区大小
  • MU 方法区已使用大小
  • CCSC 压缩类空间大小
  • CCSU 压缩类空间已使用大小
  • YGC 年轻代垃圾回收次数
  • YGCT 年轻代垃圾回收消耗时间
  • FGC Full GC垃圾回收次数
  • FGCT Full GC垃圾回收消耗时间
  • GCT 垃圾回收消耗总时间

2.4.jstack

jstack是用来查看JVM线程快照的命令,线程快照是当前JVM线程正在执行的方法堆栈集合。使用jstack命令可以定位线程出现长时间卡顿的原因,例如死锁,死循环等。jstack还可以查看程序崩溃时生成的 core 文件中的 stack 信息。

命令格式:jstack [options] <pid>

option参数解释:

  • -F 当使用jstack 无响应时,强制输出线程堆栈。
  • -m 同时输出java堆栈和c/c++堆栈信息(混合模式)。
  • -l 除了输出堆栈信息外,还显示关于锁的附加信息。 

cpu占用过高问题

  • 在thread中找到cpu占用高的线程id
  • 使用jstack -l 查看进程的线程快照
  • 线程快照中找到指定线程,并分析代码

jstack检查死锁问题

public class Demo2_DeadLock {
    
    private static Object obj1 = new Object();
    private static Object obj2 = new Object();

    public static void main(String[] args) {
        
        new Thread(new Thread1()).start();
        new Thread(new Thread2()).start();
        
    }
    
    private static class Thread1 implements Runnable {

        public void run() {
            
            synchronized (obj1) {
                System.out.println("Thread1 拿到了 obj1 的锁");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (obj2) {
                    System.out.println("Thread1 拿到了 obj2 的锁");
                }
            }
            
        }
    }

    private static class Thread2 implements Runnable {

        public void run() {
            synchronized (obj2) {
                System.out.println("Thread2 拿到了 obj2 的锁");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (obj1) {
                    System.out.println("Thread2 拿到了 obj1 的锁");
                }
            }
        }
    }
    
}

执行指令:

jstack -l 11666

2.5.jmap

jmap可以生成 java 程序的 dump 文件,也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列

命令格式:jmap [option] <pid>

option参数解释: 

  • 如果使用不带选项参数的jmap打印共享对象映射,将会打印目标虚拟机中加载的每个共享对象的起始 地址、 映射大小以及共享对象文件的路径全称。
  • -heap 打印java heap摘要
  • -histo[:live] 打印堆中的java对象统计信息
  • -clstats 打印类加载器统计信息 -finalizerinfo 打印在f-queue中等待执行finalizer方法的对象
  • -dump: 生成java堆的dump文件

dump-options:

  • live 只转储存活的对象,如果没有指定则转储所有对象
  • format=b 二进制格式
  • file= 转储文件到

常用示例: 

把java堆中的存活对象信息转储到dump.bin文件

jmap -dump:live,format=b,file=D:/dump.bin 10

输出当前没有在等待执行finalizer方法的对象

jmap -finalizerinfo 10

输出堆的详细信息

jmap -heap 10

jmap -heap 11666

输出存活对象统计信息

jmap -histo:live 11666 | more

jmap -histo:live 11666 | more

2.6.jhat

jhat是用来分析jmap生成dump文件的命令,jhat内置了应用服务器,可以通过网页查看dump文件分析结果,jhat一 般是用在离线分析上。

命令格式:jhat [option] [dumpfile]

option参数解释: 

  • -stack false: 关闭对象分配调用堆栈的跟踪
  • -refs false: 关闭对象引用的跟踪
  • -port : HTTP服务器端口,默认是7000
  • -debug : debug级别 -version 分析报告版本

 常用示例:

jhat dump.bin

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- esig.cn 版权所有 湘ICP备2023023988号-3

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务