原文出处: 纯洁的微笑
使用visualvm性能监控
1、什么是VisualVM
visualvm是jdk自带的一款监控工具。它提供了一个可视界面,用于查看 Java 虚拟机上运行的基于 Java 技术的程序的详细信息。VisualVM 对 Java Development Kit (JDK) 工具所检索的 JVM 软件相关数据进行组织,并通过一种使您可以快速查看有关多个 Java 应用程序的数据的方式提供该信息。您可以查看本地应用程序以及远程主机上运行的应用程序的相关数据
2、如何安装
在jkd bin目录下有一个jvisualvm.exe文件 双击就可以使用,或者cmd jvisualVM
3、如何使用jvisualvm
1、配置JMX管理tomcat:
set JAVA_OPTS=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9008 -Dcom.sun.management.jmxremote.authenticate=false - Dcom.sun.management.jmxremote.ssl=false
2、重启tomcat即可
3、双击jvisualvm.exe 添加服务器IP地址,添加需要监控jmx端口即可
效果如下:
打印GC日志
1.如何查看当前的垃圾回收器
-XX:+PrintFlagsFinal
-XX:+PrintCommandLineFlags
server client
MBean
GC日志
1.输出日志
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-Xloggc:/home/administrator/james/gc.log
-XX:+PrintHeapAtGC
-verbose:gc
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:D:/gc.log
java -Xms128m -Xmx128m -verbose:gc -Xloggc:/root/gc.log
-XX:+PrintHeapAtGC
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCTimeStamps
-XX:+PrintCommandLineFlags
-XX:+PrintFlagsFinal
-XX:+PrintGCDetails
-XX:+UseConcMarkSweepGC
-Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.port=9004 -Djava.rmi.server.hostname=192.168.116.11 -jar nn-ssm.war > catalina.out 2>&1 &
java -Xms128m -Xmx128m -verbose:gc -Xloggc:/root/gc.log -XX:+PrintHeapAtGC -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCTimeStamps -XX:+PrintCommandLineFlags -XX:+PrintFlagsFinal -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=9004 -Djava.rmi.server.hostname=192.168.116.11 -jar nn-ssm.war > catalina.out 2>&1 &
通过代码查看用的什么垃圾收集器
@RequestMapping("/jvm-info")
@ResponseBody
public String jvmInfo() {
List<GarbageCollectorMXBean> l=ManagementFactory.getGarbageCollectorMXBeans();
StringBuffer sb=new StringBuffer();
for(GarbageCollectorMXBean b:l) {
sb.append(b.getName()+'\n');
}
return sb.toString();
}
默认的垃圾收收集器PS Scavenge PS MarkSweep,即新生代使用Parallel Scavenge收集器,老年代使用CMS收集器
Parallel Scavenge收集器关注的是吞吐量,当系统内存不足,会频繁进行垃圾回收,不会占用CPU
CMS收集器关注的是,当系统内存不足,会占用很高的CPU
2.日志文件控制
-XX:-UseGCLogFileRotation
-XX:GCLogFileSize=8K
3.怎么看
JDK自带的 监控工具
https://docs.oracle.com/javase/8/docs/technotes/tools/windows/toc.html
jmap -heap pid 堆使用情况 (pid 通过 jps命令 获得)
jstat -gcutil pid 1000
jstack 线程dump
jvisualvm
jconsole
打印outofMemory(eclipse-mat)
http://help.eclipse.org/oxygen/index.jsp?topic=/org.eclipse.mat.ui.help/welcome.html
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/home/administrator/james/error.hprof
怀疑:
1.看GC日志 126719K->126719K(126720K)
2.dump
3.MAT
1.占用Retained Heap
2.看有没有GC Root指向
VM参数
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
3.GC日志图解
Full GC日志