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

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

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

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

(0)

相关推荐

  • Java 分析并解决内存泄漏的实例

    这几天,一直在为Java的"内存泄露"问题纠结.Java应用程序占用的内存在不断的.有规律的上涨,最终超过了监控阈值.福尔摩 斯不得不出手了! 分析内存泄露的一般步骤 如果发现Java应用程序占用的内存出现了泄露的迹象,那么我们一般采用下面的步骤分析: 把Java应用程序使用的heap dump下来 使用Java heap分析工具,找出内存占用超出预期(一般是因为数量太多)的嫌疑对象 必要时,需要分析嫌疑对象和其他对象的引用关系. 查看程序的源代码,找出嫌疑对象数量过多的原因. dum

  • java dump文件怎么生成和分析-JMAP用法详解

    jmap是java自带的工具 1. 查看整个JVM内存状态 jmap -heap [pid] 2. 查看JVM堆中对象详细占用情况 jmap -histo [pid] 3. 导出整个JVM 中内存信息,可以利用其它工具打开dump文件分析,例如jdk自带的visualvm工具 jmap -dump:file=文件名.dump [pid] 补充知识:Jmap导出java运行中的堆内存dump及Jprofiler分析方法 1.jmap导出dump 1.1运行程序的java\bin目录,执行jmap

  • 解决JMap抓取heap使用统计信息报错的问题

    如下所示: ****************************** /jmap jdk small version diffrent from jvm jdk vesionbegin/// [dev@iZ2ze8us9p89pfk02m9vs1Z ~]$ jmap -heap 1541 Attaching to process ID 1541, please wait... Error attaching to process: sun.jvm.hotspot.debugger.Debug

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

    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. Paralle

  • 巧用net命令解决XP中打印连接数问题

    这是我第一篇在<网管员世界>投稿的文章,第几期刊登的我给忘了.记得好像有几十块钱的稿费吧,呵呵没事就多投投弄点!!这种方法只是一种缓解,不过在小的环境中还是很有效果.      技巧:巧用net命令解决XP中打印连接数问题,XP专业版所带的iis默认10个连接数虽然可以用微软的MtaEdt22改变使之响应更大的连接数,但在打印连接方面却始终没有突破10的限制,用net config server命令可以查看登录用户的上限是10,空闲会话时间默认为15分钟.利用/autodisconnect 时

  • 使用 FFmpeg 命令拼接mp3音频文件异常问题及解决方法

    使用FFmpeg命令拼接多个mp3格式的音频文件时报错抛出异常,使用命令格式如下: ffmpeg -i 1.mp3 -i 2.mp3 -filter_complex '[0:0] [1:0] concat=n=2:v=0:a=1 [a]' -map [a] out3.mp3 异常错误提示信息: Automatic encoder selection failed for output stream #0:0. Default encoder for format mp3 (codec mp3)

  • 一文教会你使用jmap和MAT进行堆内存溢出分析

    jmap:Java内存映像工具 jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为heapdump或dump文件).另外,还有几种方式获取dump文件:使用JVM参数选项-XX:+HeapDumpOnOutOfMemoryError参数,可以让虚拟机在OOM异常出现之后自动生成dump文件,通过-XX:HeapDumpPath=path 设置dump文件路径(有时候dump文件比较大的时候可能无法自动导出,这时候就需要使用jmap -dump手动导出了):通过-X

  • 记一次公司JVM堆溢出抽丝剥茧定位的过程解析

    背景 公司线上有个tomcat服务,里面合并部署了大概8个微服务,之所以没有像其他微服务那样单独部署,其目的是为了节约服务器资源,况且这8个服务是属于边缘服务,并发不高,就算宕机也不会影响核心业务. 因为并发不高,所以线上一共部署了2个tomcat进行负载均衡. 这个tomcat刚上生产线,运行挺平稳.大概过了大概1天后,运维同事反映2个tomcat节点均挂了.无法接受新的请求了.CPU飙升到100%. 排查过程一 接手这个问题后.首先大致看了下当时的JVM监控. CPU的确居高不下 FULL

  • Java的jmap命令的具体使用

    目录 jmap命令简介 jmap命令参数 -heap -histo[:live] -clstats -finalizerinfo -dump:[live,]format=b,file= -F -h 和 -help jmap命令简介 jmap(Java Virtual Machine Memory Map)是JDK提供的一个可以生成Java虚拟机的堆转储快照dump文件的命令行工具.除此以外,jmap命令还可以查看finalize执行队列.Java堆和方法区的详细信息,比如空间使用率.当前使用的什

  • Java如何自定义异常打印非堆栈信息详解

    前言 在学习Java的过程中,想必大家都一定学习过异常这个篇章,异常的基本特性和使用这里就不再多讲了.什么是异常?我不知道大家都是怎么去理解的,我的理解很简单,那就是不正常的情况,比如我现在是个男的,但是我却有着女人所独有的东西,在我看来这尼玛肯定是种异常,简直不能忍.想必大家都能够理解看懂,并正确使用. 但是,光学会基本异常处理和使用不够的,在工作中出现异常并不可怕,有时候是需要使用异常来驱动业务的处理,例如: 在使用唯一约束的数据库的时候,如果插入一条重复的数据,那么可以通过捕获唯一约束异常

  • 简单说说JVM堆区的相关知识

    一.堆概述 一个jvm实例(进程)只存在一个堆内存,堆也是java内存管理的核心区域. java 堆区在jvm启动时即被创建,其空间大小也就被确定了 <java虚拟机规范>规定,堆可以处于物理上不连续的内存空间,但在逻辑上它应该被称为连续的 所有线程共享java堆,在这里和可以划分线程私有的缓冲区(tlab) 所有对象实例以及数组都应在运行时分配在堆中 方法结束后,堆中的对象不会马上被移除,仅仅在垃圾收集时候才会被移除 堆是gc执行垃圾回收的重点区域 1.1 堆内存细分 现代垃圾收集器大部分基

  • Android通过aapt命令获取apk详细信息(包括:文件包名,版本号,SDK等信息)

    公司运维问我怎么在windows上安装模拟器,我你说你安装模拟器干什么?他说,我安装模拟器查看app的包名这些信息做统计. 我顿时想,有必要这样折腾么? 我然后就给他装了Android SDK通过build-tools下面的aapt.exe文件执行命令即可得到所有apk信息. aapt命令 aapt l[ist] [-v] [-a] file.{zip,jar,apk} List contents of Zip-compatible archive. aapt d[ump] [--values]

随机推荐