一、JVM参数类型
1.标准参数:
JVM各个版本相对稳定不变:
- -help
- -server
- -client
- -version
- -showversion
- -cp
- -classpath
2.X参数
非标准化参数,JVM各个版本有可能会变,但是变化较小:
- -Xint:解释执行;
- Xcomp:第一次使用就编译成本地代码;
- Xmixed:混合模式,JVM自己来决定是否编译成本地代码;
3.XX参数
非标准化参数,相对不稳定,主要用于JVM调优和Debug:
Boolean类型
- -XX:[±]<.name>表示启用或者禁用name属性,例如:-XX:+UseConcMarkSweepGC、-XX:+UseG1GC;
非Boolean类型
- -XX:<.name>=<.value>表示name的属性值是value,例如:-XX:MaxGCPauseMillis=500、-XX:GCTimeRatio=19;
- -Xms等价于-XX:InitialHeapSize表示初始化堆的大小;
- -Xmx等价于-XX:MaxHeapSize表示最大堆的大小;
- -Xss等价于-XX:ThreadStackSize表示栈的初始化大小;
4.参考示例
二、JVM运行时参数查看
- -XX:+PrintFlagsInitial查看JVM初始参数值;
- -XX:+PrintFlagsFinal查看JVM最终参数值;
- -XX:+UnlockExperimentalVMOptions解锁实验参数;
- -XX:+UnlockDiagnosticVMOptions解锁诊断参数;
- -XX:+PrintCommandLineFlags打印命令行参数;
注意: “=”表示默认参数值;“:=”表示被用户或者JVM修改后的值。
- jps -l:类似linux上的ps,专门用来查看Java进程;
- jinfo -flag 参数名称 进程id:查看指定进程的指定参数值,例如:jinfo -flag MaxHeapSize 131011;
- jinfo -flags 进程id:查看指定进程已经被主动赋值(手动/应用)的参数信息:jinfo -flags MaxHeapSize;
三、JVM统计信息查看
1.类装载信息
- jstat -class:类加载信息,例如:jstat -class 131011 1000 3 每隔1000毫秒(1秒)输出一次类加载信息,共输出3次;
2.垃圾回收信息
jstat -gc:垃圾回收信息,例如:jstat -gc 131011 输出一次垃圾回收信息:
- S0C、S1C、S0U、S1U:S0和S1的总量与使用量;
- EC、EU:Eden区总量与使用量
- OC、OU:Old区总量与使用量
- MC、MU:Metaspace区总量与使用量
- CCSC、CCSU:压缩类空间总量与使用量
- YGC、YGCT:YoungGC的次数与时间
- FGC、FGCT:FullGC的次数与时间
- GCT:总的GC时间
3.JIT编译
- -jstat -compiler:类编译信息,例如:jstat -compiler 131011;
4.命令执行结果
四、JVM内存溢出实战(jmap+MAT)
1.如何导出内存溢出时的映像文件
- 当发生内存溢出时JVM自动导出映像文件到制定路径。例如:设置JVM内存溢出时自动导出映像文件到当前路径:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./
- 使用jmap命令手动导出:jmap -dump:format=b,file=heap.hprof 7440
2.内存映像文件分析工具
将生成的映像文件导入到MAT中,通过查看分析强引用对象的个数、内存的占比,对象内存的占用量确认是否发生内存泄漏,内存泄漏的类和方法是哪个。
3.堆内存溢出
4.非堆内存溢出
五、JVM死循环与死锁实战(jstack)
1.jstack打印JVM内部所有的线程;CPU利用率飙高
用jps -l命令查看目前正在运行的Java进程列表,根据查询的进程编号用jstack+进程编号打印进程堆栈信息如下图所示:(建议将堆栈信息重定向到文件,内容较多且保存了事故现场信息)
Java堆栈信息中nid值ox后的值即为十六进制java线程的pid,对应于命令:top -p 进程pid -H所展示的线程列表信息中十进制的pid,可以用命令:printf “x%” pid输出线程pid对应的十六进制,如下图所示:
参见死循环和死锁示例项目:monitor_tuning
六、基于Btrace的监控调试
1.安装
下载安装Btrace地址:https://github.com/btraceio/btrace
2.配置环境变量
#Btrace settings
export BTRACE_HOME=/Users/Gandoph/Program/btrace-bin-1.3.11.3
export BTRACE_BIN=$BTRACE_HOME/bin
export PATH=$PATH:$BTRACE_BIN
3.导出依赖jar包
<dependency>
<groupId>com.sun.btrace</groupId>
<artifactId>btrace-agent</artifactId>
<version>1.3.11</version>
<type>jar</type>
<scope>system</scope>
<systemPath>/Users/Gandoph/Program/btrace-bin-1.3.11.3/build/btrace-agent.jar</systemPath>
</dependency>
<dependency>
<groupId>com.sun.btrace</groupId>
<artifactId>btrace-boot</artifactId>
<version>1.3.11</version>
<type>jar</type>
<scope>system</scope>
<systemPath>/Users/Gandoph/Program/btrace-bin-1.3.11.3/build/btrace-boot.jar</systemPath>
</dependency>
<dependency>
<groupId>com.sun.btrace</groupId>
<artifactId>btrace-client</artifactId>
<version>1.3.11</version>
<type>jar</type>
<scope>system</scope>
<systemPath>/Users/Gandoph/Program/btrace-bin-1.3.11.3/build/btrace-client.jar</systemPath>
</dependency>
4.编写监控脚本
参见示例项目:monitor_tuning中btrace目录下脚本编写,如下为简单脚本示例(类似Java代码):
import com.sun.btrace.AnyType;
import com.sun.btrace.BTraceUtils;
import com.sun.btrace.annotations.BTrace;
import com.sun.btrace.annotations.Kind;
import com.sun.btrace.annotations.Location;
import com.sun.btrace.annotations.OnMethod;
import com.sun.btrace.annotations.ProbeClassName;
import com.sun.btrace.annotations.ProbeMethodName;
@BTrace
public class PrintArgSimple {
@OnMethod(
clazz="com.gandoph.monitor_tuning.btrace.Ch4Controller",
method="arg1",
location=@Location(Kind.ENTRY)
)
public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, AnyType[] args) {
BTraceUtils.printArray(args);
BTraceUtils.println(pcn+","+pmn);
BTraceUtils.println();
}
}
5.启动btrace
根据编写的btrace脚本启动btrace:
btrace 81145 PrintArgComplex.java
其中81145即为要监控应用的进程pid,如果脚本中引用了外部类,则通过需要参数指定类加载路径:-cp + classpath,常见如下命令:
btrace -cp /Users/Gandoph/workspace/monitor_tuning/target/classes 81145 PrintArgComplex.java
6.执行结果
执行结果常见下图:
版权声明:本文为u011635492原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。