java jhat_JVM学习笔记——jhat的使用

本文介绍了如何利用JavaHeapAnalysisTool(jhat)来分析Java堆内存溢出。首先,通过编写一段会导致OOM的代码,并配置JVM参数生成hprof文件。接着,使用jhat读取该文件并启动HTTP服务,通过浏览器查看详细的内存分析报告,从而快速定位内存溢出问题。此外,还提到了其他获取堆转储的工具,如jconsole、jmap和hprof。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

jhat(Java Heap Analysis Tool),是一个用来分析java的堆情况的命令。是java虚拟机自带的一种虚拟机堆转储快照分析工具。

可以用jhat命令将dump出来的hprof文件转成html的形式,然后通过http访问可以查看堆情况。OK,现在来看看要怎么做吧!

首先要一段会抛出OOM异常的代码。

public class HeapOOM {

static class OOMObject{

}

public static void main(String[] args){

List list = new ArrayList<>();

while(true){

list.add(new OOMObject());

}

}

编译之后执行时加上参数:

-Xms20M -Xmx20M -Xmn10M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="hprof文件保存路径"

openjdk@ubuntu:~$ java -Xms20M -Xmx20M -Xmn10M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/openjdk/HeapDump/ -cp /home/openjdk/NetBeansProjects/JavaApplication1/build/classes test_HeapOOM.HeapOOM

java.lang.OutOfMemoryError: Java heap space

Dumping heap to /home/openjdk/HeapDump/java_pid5239.hprof ...

Heap dump file created [27583435 bytes in 4.678 secs]

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

at java.util.Arrays.copyOf(Arrays.java:2245)

at java.util.Arrays.copyOf(Arrays.java:2219)

at java.util.ArrayList.grow(ArrayList.java:242)

at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:216)

at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:208)

at java.util.ArrayList.add(ArrayList.java:440)

at test_HeapOOM.HeapOOM.main(HeapOOM.java:24)

黑体字部分是我运行时的指令:

-Xms20M:设置JVM初始内存的大小

-Xmx20M:设置JVM最大内存

-Xmn10M:设置JVM年轻代大小

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="hprof文件保存路径":这是让堆OOM时dump出hprof文件和文件路径

这里把内存设置得很小是为了让内存尽快溢出,然后抛出异常。

可以看到文件输出为 /home/openjdk/HeapDump/java_pid5239.hprof

现在我们有了需要展示的东西,就可以请出我们的jhat了,如下:

openjdk@ubuntu:~$ jhat /home/openjdk/HeapDump/java_pid5239.hprof

Reading from /home/openjdk/HeapDump/java_pid5239.hprof...

Dump file created Fri Jan 25 20:53:37 CST 2019

Snapshot read, resolving...

Resolving 814957 objects...

Chasing references, expect 162 dots..................................................................................................................................................................

Eliminating duplicate references..................................................................................................................................................................

Snapshot resolved.

Started HTTP server on port 7000

Server is ready.

这样就启动起来了一个简易的HTTP服务,端口号是7000,尝试一下用浏览器访问一下它,本地的可以通过http://localhost:7000,就可以得到这样的页面:

ddc6d843a8a0

@All classes.png

Other Queries 查询信息的方式

All classes including platform 把所有类信息显示出来(默认是不包括Java平台的类)

另外的查看堆异常主要关注两个:

Show instance counts for all classes (excluding platform) 平台外的所有对象信息

Show heap histogram 先是堆的统计信息

ddc6d843a8a0

Show instance counts for all classes (excluding platform) .png

ddc6d843a8a0

Show heap histogram.png

通过图我们可以看到创建了810326个 test_HeapOOM.HeapOOM$OOMObject 的实例,再回顾一下我们的代码,不正是在main函数里边不停的创建OOMObject对象导致的内存溢出吗?通过jhat我们可以很快定位到内存溢出问题的所在。

除了使用-XX:+HeapDumpOnOutOfMemoryError,还可以

1. 使用 jconsole 选项通过 HotSpotDiagnosticMXBean 从运行时获得堆转储(生成hprof文件)

2. 使用jmap

3. 使用 hprof 命令

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值