解决jmap命令打印JVM堆信息异常的问题
作者:Jeremy_2019 发布时间:2023-11-05 09:07:02
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
安装完成后使用查看是否在已安装列表中,执行命令显示的确安装成功
[root@identity_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
在文件末尾,我们就可以看到明显的死锁信息。
来源:https://blog.csdn.net/u010916254/article/details/89053116


猜你喜欢
- 前言最近遇到一个很奇葩的问题,终于解决了,所以想着记录一下,方便大家或者自己以后有需要的时候可以参考学习。问题场景用小米手机使用小米推送一条
- 默认3条以上转为彩信改为5条路径vendor/mediatek/proprietary/packages/apps/Mms/src/com/
- 过滤器、 * 、 * 概念概念1、servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,可以动态生
- ContentProvider是内容提供者,可以跨进程提供数据。大家都知道,ContentProvider的启动,是在Application
- Volley简单使用我这里是以依赖架包的形式 ,大家也可以以gradle的形式进行依赖。好了,接下来上代码了.....//获取volley的
- 一、前言在做Java项目开发过程中,涉及到一些数据库服务连接配置、缓存服务器连接配置等,通常情况下我们会将这些不太变动的配置信息存储在以 .
- 问题描述:输入一个链表的头结点,从尾巴到头反过来打印出每个结点的值。首先定义链表结点public class ListNode { &nbs
- Mybatis Criteria条件查询CriterionCriterion是最基本,最底层的Where条件,用于字段级的筛选。Criter
- Spring Boot中的那些Conditionalspring boot中为我们提供了丰富的Conditional来让我们得以非常方便的在
- 以下代码实现了android的免提开启和关闭功能需要添加的权限<uses-permission android:name="
- 本文实例为大家分享了android通过servlet上传文件到服务器的具体代码,供大家参考,具体内容如下服务器端:部署在Tomcat上,直接
- 前言当我们写了一个方法,那么这个方法是如何被执行的呢?public int add(){ int a = 10;
- 一、Maven简介1. 什么是MavenMaven:是Apache提供的免费开源的项目管理工具。它提供了一个项目对象模型(pom.xml)、
- 调用海康工业相机SDK采集图像并在Halcon窗口中显示最近做项目需要对海康相机进行二次开发,现将所学进行整理。开发环境 &nbs
- 1.准备工作首先实现识别数字等字符,我们要知道需要采用OCR (Optical Character Recognition,光学字符识别)来
- 前言在一些项目中,经常会遇到需要把当前线程中的上下文传递到其他线程中的情况,比如某项目包含国际化操作,在业务请求进来时需要把对应的国家代码存
- 原理:创建一个新的Bitmap,然后再根据它来创建一个Canvas,最后调用View的draw方法将View画到Canvas上,这样得到的B
- maven thin jar 步骤spring-boot-maven-plugin configuration &
- 1. 字段取别名,和属性名保持一致映射文件<mapper namespace="com.atguigu.mybatis.ma
- 1.什么是WebSocketWebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信