jvisualvm
VisualVM 是一个性能分析工具,自从 JDK 6 Update 7 以后已经作为 Oracle JDK 的一部分,位于 JDK 根目录的 bin 文件夹下。VisualVM 自身要在 JDK6 以上的版本上运行,但是它能够监控 JDK1.4 以上版本的应用程序。下面主要介绍如何安装 VisualVM 以及各种 VisualVM 上的插件。
官方使用文档:https://visualvm.github.io/documentation.html
安装 ”Visual GC"插件:
工具->插件
这个插件是jvisualvm的插件,它非常强大,可以动态的对指定的进程进行监控,并且来通过统计面板来分类显示出各项任务/事件的总时间开销:
内存溢出异常查找过程
两类异常:
- 一、java.lang.OutOfMemoryError: PermGen space异常,此为方法区内存溢出,方法区用来存放class代码,通常解决办法就是调大jvm permSize参数值;
- 二、java.lang.OutOfMemoryError: heap space异常,比较常见的堆内存溢出。当然也可以调大jvm参数来解决,但若是不恰当代码引起的,首先检查下自己写的代码,看哪里创建了大量对象。若检查不出来,则使用jmap或jvisualvm导出内存快照。
内存溢出自动导出影像文件
程序在运行时会自动导出影像文件
在运行时可以需要添加参数,限制下内存的大小
Xms32M -Xmx32M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./
其中,-Xmx用来设置你的应用程序(不是JVM)能够使用的最大内存数,如果你的程序要花很大内存的话,那就需要修改缺省的设置,比如配置tomcat的时候,如果流量啊程序啊都很大的话就需要加大这个值了,BUT不要大得超过你的机器的内存。
另一个-Xms用来设置程序初始化的时候内存栈的大小,增加这个值的话你的程序的启动性能会得到提高。不过同样有前面的限制,以及受到-Xmx的限制。
生成的文件在你的项目根目录下
jmap 导出影像
通过jps命令查出进程
jps 命令类似与 linux 的 ps 命令,但是它只列出系统中所有的 Java 应用程序
# 文件名可以使txt,bin,hprof,dump等 jmap -dump:format=b,file=wanfile.dump 5145 # live的意思是导出存活对象,其实就是在导出之前执行一次fgc jmap -dump:live,format=b,file=wanfile.dump 5145
jmap导出文件
jmap -dump:format=b,file=heap.hprof 13904
导出后用jvisualvm来分析,导入刚刚导出的文件,案例中是通过一个while循环不断的实例化User类和添加User类。通过工具我们可以看到cpu,以及内存的使用情况。
jvisualvm远程监控tomcat
需要修改tomcat下的Catalina.sh
JAVA_ OPTS=" $JAVA_ OPTS - Dcom.sun.management.jmxremote - Dcom.sun.management.jmxremote.port=9004 - Dcom.sun.managementjmxremote.authenticatefalse - Dcom.sun.management.jmxremote.ssl=false -Djava.net.preferlPv4Stack=true - Djava.rmi.server.hostname 10.110.3.62"
jvisualvm远程普通java程序
nohup java -Dcom.sun.management.jmxremote - Dcom.sun.management.jmxremote.port9005 - Dcom.sun.management.jmxremote.authenticate=false - Dcom.sun.management.jmxremote.ssl=false -Djava.net.preferlPv4Stack=true - Djava.rmi.server.hostname10.110.3.62 -jar lq.jar &
Linux下查看内存情况
查看进程占用情况分析:
top
查看某个进程内部线程占用情况分析:
top -Hp 21977
查到这几个线程的cpu过高之后把它转成二进制
printf "%x" 21519
使用jstack就可以查看线程信息
想要通过jstack命令来分析线程的情况的话,首先要知道线程都有哪些状态,下面这些状态是我们使用jstack命令查看线程堆栈信息时可能会看到的线程的几种状态:
NEW,未启动的。不会出现在Dump中。
RUNNABLE,在虚拟机内执行的。运行中状态,可能里面还能看到locked字样,表明它获得了某把锁。
BLOCKED,受阻塞并等待监视器锁。被某个锁(synchronizers)給block住了。
WATING,无限期等待另一个线程执行特定操作。等待某个condition或monitor发生,一般停留在park(), wait(), sleep(),join() 等语句里。
TIMED_WATING,有时限的等待另一个线程的特定操作。和WAITING的区别是wait() 等语句加上了时间限制 wait(timeout)。
TERMINATED,已退出的。
jstack 540f
jstat之gcutil数据解析
查看java应用内存情况
##pid为4007的应用的情况,每2秒钟显示一次 jstat -gcutil 4007 2000 S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 37.03 0.00 20.87 86.82 94.40 89.37 1640 9.248 6 0.658 9.907
S0: Survivor space 0 utilization as a percentage of the space’s current capacity. 幸存者区0
S1: Survivor space 1 utilization as a percentage of the space’s current capacity. 幸存者区1
E: Eden space utilization as a percentage of the space’s current capacity. 伊甸园区
O: Old space utilization as a percentage of the space’s current capacity. 老年代
M: Metaspace utilization as a percentage of the space’s current capacity. 元空间
CCS: Compressed class space utilization as a percentage. 压缩类空间利用率为百分比。
YGC: Number of young generation GC events. 年轻一代GC事件的数量。
YGCT: Young generation garbage collection time. 年轻一代垃圾收集时间
FGC: Number of full GC events. 完整的GC事件的数量。
FGCT: Full garbage collection time. 完全垃圾收集时间。
GCT: Total garbage collection time. 垃圾回收总时间。