首页 > 系统相关 >如何查看JVM运行的堆内存情况

如何查看JVM运行的堆内存情况

时间:2023-06-19 11:31:54浏览次数:54  
标签:file dump 查看 JVM live 内存 heap print jmap


不可不知的7个JDK命令》介绍了些jdk自带的问题排查工具,机器出现CPU飙升的情况,此时就可以借助工具,排查应用端是否存在一些潜在问题。

jmap指令可以查看JVM运行的堆内存情况,

[test@localhost]> jmap -h
Usage:
    jmap [option] <pid>
        (to connect to running process)
    jmap [option] <executable <core>
        (to connect to a core file)
    jmap [option] [server_id@]<remote server IP or hostname>
        (to connect to remote debug server)


where <option> is one of:
    <none>               to print same info as Solaris pmap
    -heap                to print java heap summary
    -histo[:live]        to print histogram of java object heap; if the "live"
                         suboption is specified, only count live objects
    -permstat            to print permanent generation statistics
    -finalizerinfo       to print information on objects awaiting finalization
    -dump:<dump-options> to dump java heap in hprof binary format
                         dump-options:
                           live         dump only live objects; if not specified,
                                        all objects in the heap are dumped.
                           format=b     binary format
                           file=<file>  dump heap to <file>
                         Example: jmap -dump:live,format=b,file=heap.bin <pid>
    -F                   force. Use with -dump:<dump-options> <pid> or -histo
                         to force a heap dump or histogram when <pid> does not
                         respond. The "live" suboption is not supported
                         in this mode.
    -h | -help           to print this help message
    -J<flag>             to pass <flag> directly to the runtime system

通常,我们以hprof二进制格式dump堆的使用情况,相当于生成一个快照,然后分析这个快照文件,生成快照的指令,

[test@localhost]> jmap -dump:format=b,file=heap20200721.dump xxxxx(可以通过ps获取java进程pid号)
Dumping heap to /opt/applog/heap20200721.dump ...
Heap dump file created

在当前的路径,生成了dump文件,

-rw------- 1 jcf jcf 467M Jul 21 11:27 heap20200721.dump

然后下载文件,可以用Eclipse的MAT(Memory Analyzer)插件进行分析,如果不用插件,MAT可以直接下载,地址如下,

https://www.eclipse.org/mat/downloads.php

运行MemoryAnalyzer.exe,要求至少jdk1.8以上的环境,选择打开刚才下载的dump文件,

如何查看JVM运行的堆内存情况_mysql

等待一段时间,就可以看到统计图了,

如何查看JVM运行的堆内存情况_linux_02

从生成的文件看其实是创建了一系列索引文件,在MAT中点击不同的选项时,应该就是从这些索引文件链接过来的,

如何查看JVM运行的堆内存情况_mysql_03

例如,可以看下可能的泄露问题,点击饼图部分,就可以看到构成此问题的具体类,因为涉及细节,在此不做展示,

如何查看JVM运行的堆内存情况_linux_04

通过MAT,还可以浏览以下相关信息,

  • System Properties
  • Thread Overview
  • Top Consumers
  • Class Histogram

其实,除了MAT,还有其他能看dump文件的工具,例如jdk自带的jhat,他可以分析堆,并将堆中对象以html的形式显示出来,支持对象查询语言OQL,操作更加粗暴,参数就是任意可用的端口和dump文件名,

[test@localhost]> jhat -port 9999 heap20200721.dump
Reading from heap20200721.dump...
Dump file created Tue Jul 21 11:27:12 CST 2020
Snapshot read, resolving...
Resolving 5995070 objects...
WARNING:  Failed to resolve object id 0xe2db5378 for field annotations (signature L)
...(省略)
WARNING:  Failed to resolve object id 0xe195ce40 for field annotationDefault (signature L)
Chasing references, expect 1199 dots.............................................................................................................................
Eliminating duplicate references.............................................................................................................................
Snapshot resolved.
Started HTTP server on port 9999
Server is ready.

通过浏览器,访问http://10.221.165.176:9999/,就打开了网页,他是按照报名进行的分组,

如何查看JVM运行的堆内存情况_mysql_05

可以拉到网页的底部,支持各种检索的快捷链接,

如何查看JVM运行的堆内存情况_java_06

例如QQL语言,可以用类SQL写出检索字符串长度超过100的实例,

如何查看JVM运行的堆内存情况_oracle_07

得到分析文件,其实只是个工具的使用问题,如何从这些零碎的信息中,得到问题真谛,这才是关键,让我这个小白,和大家一起继续学习了。


标签:file,dump,查看,JVM,live,内存,heap,print,jmap
From: https://blog.51cto.com/u_13950417/6512064

相关文章

  • SQL调优:让Java内存分担计算
    作者: 剽悍一小兔我们在工作中,经常会因为一条慢sql调半天。这一节,我给大家介绍一种提升查询效率的思路,那就是让Java内存帮我们分担一些运算。案例还是采用springBoot日记本系统,源码下载地址和教程在文末。先改一个BUG之前遗留了一个BUG需要我们解决,就是在日记的详情页,日记类型没......
  • 必知必会:JVM
    JVM-Java虚拟机Java程序运行时,编译器将Java文件编译成平台无关的Java字节码文件(.class)。对应平台JVM对字节码文件进行解释,翻译成对应平台匹配的机器指令并运行。JVM内存区域(内存结构)JVM内存区域粗略划分为堆和栈。按虚拟机规范划分为五部分,包括程序计数器、虚拟机栈、本......
  • 快速查看日志的方法
    快速查看日志的方法摘要本文主要是仿写自:https://www.cnblogs.com/codelogs/p/16410363.html原创:扣钉日记(微信公众号ID:codelogs)感觉公众号作者的文章挺好的.周末在家看了一些,感觉很有收获的确能够解决自己遇到的一些问题但是感觉早上六点多看完,到了中午就忘记的差不......
  • 美团一面:OOM后,JVM一定会退出吗?为什么?
    文章且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪酬猛......
  • Linux 虚拟内存系统
    Linux虚拟内存系统首先,对Linux的虚拟内存系统做一个概述,以了解一个实际的操作系统是如何组织虚拟内存,以及如何处理缺页(pagefault)的。Linux位为每个进程维护了一个单独的虚拟地址空间,形式如下:可以看到,虚拟地址空间可以分为内核虚拟内存空间和用户虚拟内存空间两部分,实际上......
  • 浅聊一下 C#程序的 内存映射文件 玩法
    一:背景1.讲故事前段时间训练营里有朋友问内存映射文件是怎么玩的?说实话这东西理论我相信很多朋友都知道,就是将文件映射到进程的虚拟地址,说起来很容易,那如何让大家眼见为实呢?可能会难倒很多人,所以这篇我以自己的认知尝试让大家眼见为实。二:如何眼见为实1.我想象的文件映射在任何......
  • C语言基础教程(动态内存分配)
    (文章目录)前言本篇文章来讲解C语言中的动态内存分配,在C语言中动态内存分配经常使用,合理的使用动态内存分配可以帮助我们节省代码空间,当然了不合理的使用可能导致程序的崩溃,或者是内存的泄漏。一、动态内存分配常用函数在C语言中,动态内存分配是一种在程序运行时分配和释放内......
  • 内存池
    内存池///<author>cxg2020-9-8</author>///支持D7,更低版本没有测试,支持跨OSunitMemPool;interfaceusesMath,Classes,SysUtils,SyncObjs;type{$ifCompilerVersion<18}//beforedelphi2007TBytes=arrayofByte;{$ifend}TMemBlock=re......
  • 申威3231_SPECJVM2008的测试结果与信创服务器对比验证
    申威3231_SPECJVM2008的测试结果与信创服务器对比验证背景周六找同事将在公司里的机器进行了开机.然后验证了config.guess和config.sub的确是可以通过复制/usr下面的文件进行解决的但是perl的很多model无法使用.所以没办法,准备测试一把SPECJVM2008其实周五晚上看......
  • 如何查看网站的开发信息
    WebTechnologiesusedbyCnblogs.com(w3techs.com)这个网站可以查看网站的开发信息。w3techs.com 例如上面就显示了博客园的后端是ASP。。。。。。。妈耶,一直以为是PHP前端居然用了VUE。666 ......