Java异常分析工具的使用

简介: 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的插件,它非常强大,可以动态的对指定的进程进行监控,并且来通过统计面板来分类显示出各项任务/事件的总时间开销:

20190512111553292.png

内存溢出异常查找过程

两类异常:

  • 一、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 导出影像

image.png

通过jps命令查出进程

jps 命令类似与 linux 的 ps 命令,但是它只列出系统中所有的 Java 应用程序

20190512112558154.png

# 文件名可以使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

20190512112905258.png

导出后用jvisualvm来分析,导入刚刚导出的文件,案例中是通过一个while循环不断的实例化User类和添加User类。通过工具我们可以看到cpu,以及内存的使用情况。

20190512113331135.png

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

2019051300061083.png

查看某个进程内部线程占用情况分析:

top -Hp 21977

20190512233315150.png

查到这几个线程的cpu过高之后把它转成二进制

printf "%x" 21519

20190513000934858.png

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

相关文章
|
5天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
5天前
|
Java
在 Java 中,如何自定义`NumberFormatException`异常
在Java中,自定义`NumberFormatException`异常可以通过继承`IllegalArgumentException`类并重写其构造方法来实现。自定义异常类可以添加额外的错误信息或行为,以便更精确地处理特定的数字格式转换错误。
|
28天前
|
监控 Java 测试技术
Java开发现在比较缺少什么工具?
【10月更文挑战第15天】Java开发现在比较缺少什么工具?
34 1
|
6天前
|
IDE 前端开发 Java
怎样避免 Java 中的 NoSuchFieldError 异常
在Java中避免NoSuchFieldError异常的关键在于确保类路径下没有不同版本的类文件冲突,避免反射时使用不存在的字段,以及确保所有依赖库版本兼容。编译和运行时使用的类版本应保持一致。
|
7天前
|
Java 编译器
如何避免在 Java 中出现 NoSuchElementException 异常
在Java中,`NoSuchElementException`通常发生在使用迭代器、枚举或流等遍历集合时,尝试访问不存在的元素。为了避免该异常,可以在访问前检查是否有下一个元素(如使用`hasNext()`方法),或者使用`Optional`类处理可能为空的情况。正确管理集合边界和条件判断是关键。
|
10天前
|
Java
Java异常捕捉处理和错误处理
Java异常捕捉处理和错误处理
12 1
|
12天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
27 2
|
19天前
|
Java
如何在 Java 中处理“Broken Pipe”异常
在Java中处理“Broken Pipe”异常,通常发生在网络通信中,如Socket编程时。该异常表示写入操作的另一端已关闭连接。解决方法包括:检查网络连接、设置超时、使用try-catch捕获异常并进行重试或关闭资源。
|
20天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
20天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。