解决jmap命令打印JVM堆信息异常的问题

 更新时间:2020年12月4日 17:45  点击:2269

jmap命令可以打印java进程的JVM堆信息,今天在某台机器上运行该命令查看 19560进程的堆信息

jmap -heap 19560

出现以下异常

Attaching to process ID 19560, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.79-b02
 
using thread-local object allocation.
Parallel GC with 33 thread(s)
 
Heap Configuration:
  MinHeapFreeRatio = 0
  MaxHeapFreeRatio = 100
  MaxHeapSize   = 32038191104 (30554.0MB)
  NewSize     = 1310720 (1.25MB)
  MaxNewSize    = 17592186044415 MB
  OldSize     = 5439488 (5.1875MB)
  NewRatio     = 2
  SurvivorRatio  = 8
  PermSize     = 21757952 (20.75MB)
  MaxPermSize   = 174063616 (166.0MB)
  G1HeapRegionSize = 0 (0.0MB)
 
Heap Usage:
Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at sun.tools.jmap.JMap.runTool(JMap.java:197)
    at sun.tools.jmap.JMap.main(JMap.java:128)
Caused by: java.lang.RuntimeException: unknown CollectedHeap type : class sun.jvm.hotspot.gc_interface.CollectedHeap
    at sun.jvm.hotspot.tools.HeapSummary.run(HeapSummary.java:146)
    at sun.jvm.hotspot.tools.Tool.start(Tool.java:221)
    at sun.jvm.hotspot.tools.HeapSummary.main(HeapSummary.java:40)
    ... 6 more

是因为机器上缺少 openjdk-debuginfo 包 或者 机器上的 openjdk-debuginfo 包与jdk版本不一致导致

是用 java -version 查看机器上的java版本

java version "1.7.0_79"

OpenJDK Runtime Environment (rhel-2.5.5.4.el6-x86_64 u79-b14)

OpenJDK 64-Bit Server VM (build 24.79-b02, mixed mode)

到 http://debuginfo.centos.org/6/x86_64/ 网站上去查找和jdk版本对应的debuginfo包,我的jdk版本是 1.7.0_79,所以页面展示完所有的包后,搜索 openjdk-debuginfo-1.7.0.79,总共出现了三个包

java-1.7.0-openjdk-debuginfo-1.7.0.79-2.5.5.1.el6_6.x86_64.rpm

java-1.7.0-openjdk-debuginfo-1.7.0.79-2.5.5.3.el6_6.x86_64.rpm

java-1.7.0-openjdk-debuginfo-1.7.0.79-2.5.5.4.el6.x86_64.rpm

均满足我的jdk版本,下载第一个进行尝试,下载完成后使用 rpm命令安装

rpm -ivh java-1.7.0-openjdk-debuginfo-1.7.0.79-2.5.5.1.el6_6.x86_64.rpm

安装完成后使用查看是否在已安装列表中,执行命令显示的确安装成功

[[email protected]_test tmp]# rpm -qa |grep debuginfo

java-1.7.0-openjdk-debuginfo-1.7.0.79-2.5.5.1.el6_6.x86_64

再次执行我最初想执行的命令

jmap -heap 19560

已经能正常显示JVM堆区信息

Attaching to process ID 19560, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.79-b02
 
using thread-local object allocation.
Parallel GC with 33 thread(s)
 
Heap Configuration:
  MinHeapFreeRatio = 0
  MaxHeapFreeRatio = 100
  MaxHeapSize   = 32038191104 (30554.0MB)
  NewSize     = 1310720 (1.25MB)
  MaxNewSize    = 17592186044415 MB
  OldSize     = 5439488 (5.1875MB)
  NewRatio     = 2
  SurvivorRatio  = 8
  PermSize     = 21757952 (20.75MB)
  MaxPermSize   = 174063616 (166.0MB)
  G1HeapRegionSize = 0 (0.0MB)
 
Heap Usage:
PS Young Generation
Eden Space:
  capacity = 537919488 (513.0MB)
  used   = 532557632 (507.88653564453125MB)
  free   = 5361856 (5.11346435546875MB)
  99.00322332252071% used
From Space:
  capacity = 89128960 (85.0MB)
  used   = 0 (0.0MB)
  free   = 89128960 (85.0MB)
  0.0% used
To Space:
  capacity = 89128960 (85.0MB)
  used   = 0 (0.0MB)
  free   = 89128960 (85.0MB)
  0.0% used
PS Old Generation
  capacity = 1431306240 (1365.0MB)
  used   = 844440 (0.8053207397460938MB)
  free   = 1430461800 (1364.194679260254MB)
  0.058997856391655217% used
PS Perm Generation
  capacity = 22020096 (21.0MB)
  used   = 8512616 (8.118263244628906MB)
  free   = 13507480 (12.881736755371094MB)
  38.65839640299479% used
 
3145 interned Strings occupying 252104 bytes.

补充知识:JVM参数,jmap打印堆快照,jstack实战死锁

1 jinfo指令:如何运行时查看参数值

jinfo -flag MaxHeapSize 23789(查看最大堆:23789即线程id)

jinfo -flag ThreadStackSize 23789(查询线程栈大小:默认值1024)

2 查看jvm运行时参数

(1)-XX:+PrintFlagsInitial 查看初始值

=表示默认值

:=被用户或者JVM修改后的值

(2)-XX:+PrintFlagsFinal表示打印出运行时参数生效的值

-XX:+UnlockExperimentalVMOptions解锁实验参数(并非所有的参数都可以直接修改)

(3)jps

jps是用于查看有权访问的hotspot虚拟机的进程. 当未指定hostid时,默认查看本机jvm进程,否者查看指定的hostid机器上的jvm进程,此时hostid所指机器必须开启jstatd服务。 jps可以列出jvm进程lvmid,主类类名,main函数参数, jvm参数,jar名称等信息。

(4)jinfo -flag 23789(查看tomcat进程23789运行时jvm参数)

jinfo -flag UseParallelGC 23789

jinfo -flag UseG1GC 23789

jinfo -flag UseConcMarkSweepGC 23789

(5)jstat 查看JVM统计信息,例如类加载信息、垃圾收集、JIT编译

jstat -class 23789 加载了多少个类,占用多少Kb,卸载多少个,平台卸载加载所花费时间

jstat -gc 23789

jstat -gc 23789 1000 10 (每个1秒打印gc信息,共打印10次)

Metaspace里面有ccs, CodeCache等ccs表示启用指向自己类文件的短指针的时候就会存在ccs。CodeCache:存放jit编译代码信息。把java代码转化为native代码。

(6)jmap+MAT实战内存溢出

①导出内存映射文件:

自动导出:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./

jmap命令手动导出:

jmap -dump:format=b,file=heap.hprof 23789

我们实验的时候在eclipse debug添加参数:

-Xms23m -Xmx23m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./

②导入mat中分析:

File -> openFile ->导入自己的文件heap.hprof

查看可能存在内存溢出:

查看类占用内存大小

正则匹配查看我们的类占用内存大小(shallow heap不包括其内部引用对象大小)

(7)jstack 查看线程

jstack 23789 > 23789.txt

注意: top命令查看pid是十进制的,printf “%x” 23789 就将23789转化为16进制5ced。然后在23789.txt中搜索ox5ced,就能找到pid对应的类信息

死循环案例分析:

private Object lock1 = new Object();
private Object lock2 = new Object();
public  String deadlock() {
   new Thread(() -> {
  synchronized(lock1) {
  synchronized(lock1) {System.out.println(“Thread1 get lock1”)}
  try{Thread.sleep(5000);}cache(Exception e){}
  synchronized(lock2) {System.out.println(“Thread1 get lock2”)}
}
}).start();
new Thread(() -> {
  synchronized(lock2) {
  synchronized(lock1) {System.out.println(“Thread2 get lock2”)}
  try{Thread.sleep(5000);}cache(Exception e){}
  synchronized(lock1) {System.out.println(“Thread2 get lock1”)}
}
}).start();
}

jstack 线程id > 线程id.txt

在文件末尾,我们就可以看到明显的死锁信息。

以上这篇解决jmap命令打印JVM堆信息异常的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持猪先飞。

相关文章

  • 使用percona-toolkit操作MySQL的实用命令小结

    1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24
  • PHP实现连接设备、通讯和发送命令的方法

    本文实例讲述了PHP实现连接设备、通讯和发送命令的方法。分享给大家供大家参考。具体如下:开发的BS架构的软件(PHP),需要跟设备进行通讯,在此记录一下,欢迎各位指正:1. 采用php socket技术使用TCP/IP连接设备参数$service_po...2015-10-21
  • Mysql命令大全(详细篇)

    一、连接Mysql格式: mysql -h主机地址 -u用户名 -p用户密码1、连接到本机上的MYSQL。首先打开DOS窗口,然后进入目录mysql/bin,再键入命令mysql -u root -p,回车后提示你输密码.注意用户名前可以有空格也可以没有空格,但是密...2015-11-08
  • 对MySQL日志操作的一些基本命令总结

    MySQL日志主要包含:错误日志、查询日志、慢查询日志、事务日志、二进制日志;日志是mysql数据库的重要组成部分。日志文件中记录着mysql数据库运行期间发生的变化;也就是说用来记录mysql数据库的客户端连接状况、SQL语句...2015-11-24
  • C#隐式运行CMD命令(隐藏命令窗口)

    这篇文章主要介绍了C#隐式运行CMD命令(隐藏命令窗口),本文实现在winform窗口中运行CMD命令,需要的朋友可以参考下...2020-06-25
  • 解决jmap命令打印JVM堆信息异常的问题

    这篇文章主要介绍了解决jmap命令打印JVM堆信息异常的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-04
  • 在docker中执行linux shell命令的操作

    这篇文章主要介绍了在docker中执行linux shell命令的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-30
  • shell脚本批量复制及执行命令的示例详解

    这篇文章主要介绍了批量复制及执行命令shell脚本,本文通过列举几个示例给大家详细介绍,对大家的工作或学习具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
  • python之pyinstaller组件打包命令和异常解析实战

    前段时间在制作小工具的时候,直接在命令行用pyinstaller工具打包成功后,启动exe可执行文件的时候各种报错, 今天,我们就分享一下踩坑经过,需要的朋友可以参考下...2021-09-20
  • Redis Scan命令的基本使用方法

    这篇文章主要给大家介绍了关于Redis中Scan命令的基本使用方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2021-01-15
  • Zabbix远程执行命令的示例详解

    这篇文章主要介绍了Zabbix远程执行命令,本文主要配置验证zabbix执行远程命令的相关知识,通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值 ,需要的朋友可以参考下...2021-05-07
  • redis中scan命令的基本实现方法

    这篇文章主要给大家介绍了关于redis中scan命令的基本实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-15
  • MySQL中的binlog相关命令和恢复技巧

    操作命令:复制代码 代码如下:show binlog events in 'mysql-bin.000016' limit 10;reset master 删除所有的二进制日志flush logs 产生一个新的binlog日志文件show master logs; 或者 show binary logs; 查看二进制文...2014-05-31
  • POP3协议命令原始码及工作原理

    http://www.linuxforum.net Jephe Wu (2001-04-21 18:17:49) 一 简介: 1. POP适用于C/S结构的脱机模型的电子邮件协议,目前已发展到第三版,称POP3。脱机模型即不能在...2016-11-25
  • Linux的netstat命令详解

    这篇文章主要介绍了Linux的netstat命令,netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告。需要的朋友可以参考下面文章内容...2021-09-03
  • MySQL的常用命令集锦

    下面是我们经常会用到且非常有用的MySQL命令。下面你看到#表示在Unix命令行下执行命令,看到mysql>表示当前已经登录MySQL服务器,是在mysql客户端执行mysql命令。 登录MySQL,如果连接远程数据库,需要用-h指定hostname。登...2015-11-24
  • 一条命令重启所有已停止的docker容器操作

    这篇文章主要介绍了一条命令重启所有已停止的docker容器操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-20
  • Photoshop动作命令制作漂亮的五彩光环教程

    今天小编在这里就来给各位photoshop的这一款软件的使用者们来说一说动作命令制作漂亮的五彩光环的教程,各位想知道具体制作方法的使用者们,那么大家就快来看一看小编带...2016-09-14
  • 基于make命令与makefile文件详解

    下面小编就为大家分享一篇基于make命令与makefile文件详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-25
  • yiic命令时提示“php.exe”不是内部或外部命令解决办法

    文章给各位简单的介绍yiic命令时提示“php.exe”不是内部或外部命令解决办法,希望能帮助到各位。 在CMD中运行 yiic webapp work 如果报’php.exe’不...2016-11-25