美文网首页
JVM学习笔记——jhat的使用

JVM学习笔记——jhat的使用

作者: 南宫知晓 | 来源:发表于2019-01-25 22:33 被阅读0次
       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<OOMObject> 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,就可以得到这样的页面:

    @All classes.png

    Other Queries 查询信息的方式

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

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

    Show instance counts for all classes (excluding platform) 平台外的所有对象信息
    Show heap histogram 先是堆的统计信息

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

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

    除了使用-XX:+HeapDumpOnOutOfMemoryError,还可以
    1. 使用 jconsole 选项通过 HotSpotDiagnosticMXBean 从运行时获得堆转储(生成hprof文件)
    2. 使用jmap
    3. 使用 hprof 命令
    以上三种方式来自Java命令学习系列(5):Jhat,还没有具体实践。

    相关文章

      网友评论

          本文标题:JVM学习笔记——jhat的使用

          本文链接:https://www.haomeiwen.com/subject/pssvjqtx.html