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

相关文章
|
17天前
|
监控 Java 测试技术
Java开发现在比较缺少什么工具?
【10月更文挑战第15天】Java开发现在比较缺少什么工具?
30 1
|
19小时前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
8 2
|
7天前
|
Java
如何在 Java 中处理“Broken Pipe”异常
在Java中处理“Broken Pipe”异常,通常发生在网络通信中,如Socket编程时。该异常表示写入操作的另一端已关闭连接。解决方法包括:检查网络连接、设置超时、使用try-catch捕获异常并进行重试或关闭资源。
|
9天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
9天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
11天前
|
Web App开发 Java
使用java操作浏览器的工具selenium-java和webdriver下载地址
【10月更文挑战第12天】Selenium-java依赖包用于自动化Web测试,版本为3.141.59。ChromeDriver和EdgeDriver分别用于控制Chrome和Edge浏览器,需确保版本与浏览器匹配。示例代码展示了如何使用Selenium-java模拟登录CSDN,包括设置驱动路径、添加Cookies和获取页面源码。
|
10天前
|
存储 安全 Java
如何避免 Java 中的“ArrayStoreException”异常
在Java中,ArrayStoreException异常通常发生在尝试将不兼容的对象存储到泛型数组中时。为了避免这种异常,确保在操作数组时遵循以下几点:1. 使用泛型确保类型安全;2. 避免生类型(raw types)的使用;3. 在添加元素前进行类型检查。通过这些方法,可以有效防止 ArrayStoreException 的发生。
|
29天前
|
Java 流计算
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
34 1
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
|
11天前
|
人工智能 Oracle Java
解决 Java 打印日志吞异常堆栈的问题
前几天有同学找我查一个空指针问题,Java 打印日志时,异常堆栈信息被吞了,导致定位不到出问题的地方。
25 2
|
14天前
|
Java 索引
如何避免在 Java 中引发`StringIndexOutOfBoundsException`异常
在Java中,处理字符串时若访问了不存在的索引,会抛出`StringIndexOutOfBoundsException`异常。为避免此异常,应确保索引值在有效范围内,例如使用`length()`方法检查字符串长度,并确保索引值不小于0且不大于字符串长度减1。