Java异常分析工具的使用

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. 垃圾回收总时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原飞木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值