Java8性能监控与调优

一、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.参考示例

Java8性能监控与调优_第1张图片

二、JVM运行时参数查看

  • -XX:+PrintFlagsInitial查看JVM初始参数值;
  • -XX:+PrintFlagsFinal查看JVM最终参数值;
  • -XX:+UnlockExperimentalVMOptions解锁实验参数;
  • -XX:+UnlockDiagnosticVMOptions解锁诊断参数;
  • -XX:+PrintCommandLineFlags打印命令行参数;
    Java8性能监控与调优_第2张图片
   注意: “=”表示默认参数值;“:=”表示被用户或者JVM修改后的值。
  • jps -l:类似linux上的ps,专门用来查看Java进程;
  • jinfo -flag 参数名称 进程id:查看指定进程的指定参数值,例如:jinfo -flag MaxHeapSize 131011;
  • jinfo -flags 进程id:查看指定进程已经被主动赋值(手动/应用)的参数信息:jinfo -flags MaxHeapSize;
    Java8性能监控与调优_第3张图片

三、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.命令执行结果

Java8性能监控与调优_第4张图片

四、JVM内存溢出实战(jmap+MAT)

1.如何导出内存溢出时的映像文件

  • 当发生内存溢出时JVM自动导出映像文件到制定路径。例如:设置JVM内存溢出时自动导出映像文件到当前路径:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./
  • 使用jmap命令手动导出:jmap -dump:format=b,file=heap.hprof 7440
    Java8性能监控与调优_第5张图片

2.内存映像文件分析工具

        将生成的映像文件导入到MAT中,通过查看分析强引用对象的个数、内存的占比,对象内存的占用量确认是否发生内存泄漏,内存泄漏的类和方法是哪个。
Java8性能监控与调优_第6张图片
Java8性能监控与调优_第7张图片
Java8性能监控与调优_第8张图片

3.堆内存溢出

参见内存溢出示例项目:monitor_tuning

4.非堆内存溢出

参见内存溢出示例项目:monitor_tuning

五、JVM死循环与死锁实战(jstack)

1.jstack打印JVM内部所有的线程;CPU利用率飙高

        用jps -l命令查看目前正在运行的Java进程列表,根据查询的进程编号用jstack+进程编号打印进程堆栈信息如下图所示:(建议将堆栈信息重定向到文件,内容较多且保存了事故现场信息)
Java8性能监控与调优_第9张图片
        Java堆栈信息中nid值ox后的值即为十六进制java线程的pid,对应于命令:top -p 进程pid -H所展示的线程列表信息中十进制的pid,可以用命令:printf “x%” pid输出线程pid对应的十六进制,如下图所示:
Java8性能监控与调优_第10张图片
参见死循环和死锁示例项目: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包

   	
   		com.sun.btrace
   		btrace-agent
   		1.3.11
   		jar
   		system
   		/Users/Gandoph/Program/btrace-bin-1.3.11.3/build/btrace-agent.jar
   	
   	
   		com.sun.btrace
   		btrace-boot
   		1.3.11
   		jar
   		system
   		/Users/Gandoph/Program/btrace-bin-1.3.11.3/build/btrace-boot.jar
   	
   	
   		com.sun.btrace
   		btrace-client
   		1.3.11
   		jar
   		system
   		/Users/Gandoph/Program/btrace-bin-1.3.11.3/build/btrace-client.jar
   	

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.执行结果

       执行结果常见下图:
btrace追踪脚本执行结果

你可能感兴趣的:(Java,JDK,JVM)