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

相关文章
|
1月前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
62 1
|
1月前
|
Java API 调度
如何避免 Java 中的 TimeoutException 异常
在Java中,`TimeoutException`通常发生在执行操作超过预设时间时。要避免此异常,可以优化代码逻辑,减少不必要的等待;合理设置超时时间,确保其足够完成正常操作;使用异步处理或线程池管理任务,提高程序响应性。
66 12
|
1月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
69 9
|
1月前
|
Java
在 Java 中,如何自定义`NumberFormatException`异常
在Java中,自定义`NumberFormatException`异常可以通过继承`IllegalArgumentException`类并重写其构造方法来实现。自定义异常类可以添加额外的错误信息或行为,以便更精确地处理特定的数字格式转换错误。
36 1
|
25天前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
137 83
|
22天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
40 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
25天前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
53 26
|
26天前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
49 24
|
23天前
|
监控 算法 Java
jvm-48-java 变更导致压测应用性能下降,如何分析定位原因?
【11月更文挑战第17天】当JVM相关变更导致压测应用性能下降时,可通过检查变更内容(如JVM参数、Java版本、代码变更)、收集性能监控数据(使用JVM监控工具、应用性能监控工具、系统资源监控)、分析垃圾回收情况(GC日志分析、内存泄漏检查)、分析线程和锁(线程状态分析、锁竞争分析)及分析代码执行路径(使用代码性能分析工具、代码审查)等步骤来定位和解决问题。
|
25天前
|
数据采集 存储 监控
Java爬虫:数据采集的强大工具
在数据驱动的时代,Java爬虫技术凭借其强大的功能和灵活性,成为企业获取市场信息、用户行为及竞争情报的关键工具。本文详细介绍了Java爬虫的工作原理、应用场景、构建方法及其重要性,强调了在合法合规的前提下,如何有效利用Java爬虫技术为企业决策提供支持。