命令介绍

jmap - Prints shared object memory maps or heap memory details for a process, core file, or remote

debug server.

jmap不仅能生成dump文件,还阔以查询finalize执行队列、Java堆和永久代的详细信息,如当前使用率、当前使用的是哪种收集器等。主要的作用是检查内存泄漏、对象创建不合理和销毁等问题

语法:

jmap [ options ] pid

jmap [ options ] executable core

jmap [ options ] [ pid ] server-id@ ] remote-hostname-or-IP

常用选项

-dump:[live,] format=b, file=filename

dump堆使用信息到文件,format指定格式,live指存活的对象,file为文件名

[root@node1 ~]# jmap -dump:live,format=b,file=hprof.dump 2712

2712: Unable to open socket file: target process not responding or HotSpot VM not loaded

The -F option can be used when the target process isnot responding

报错原因:

jvm运行时会生成一个目录hsperfdata_$USER($USER是启动java进程的用户),在linux中默认是/tmp。目录下会有些pid文件,存放jvm进程信息。

jvm相关命令会从这个路径/tmp/hsperfdata_$USER去获取pid的连接信息,我是root用户执行的命令,所以没有pid文件,而对应应用程序里面有

例如:

jmap报错原因:

可能是由于tmpwatch机制,防止/tmp目录里文件过多,系统每天基于此机制删除超过240小时未访问的文件和目录。

jmap和jstack不能正常运行的原因:

因为对应目录里没有pid文件

查看关键配置/etc/cron.daily/tmpwatch:

flags=-umc /usr/sbin/tmpwatch "$flags"

-x /tmp/.X11-unix -x /tmp/.XIM-unix \

-x /tmp/.font-unix -x /tmp/.ICE-unix

-x /tmp/.Test-unix 240 /tmp /usr/sbin/tmpwatch "$flags" 720 /var/tmp

for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?};

do if [ -d "$d" ]; then /usr/sbin/tmpwatch "$flags" -f 720 "$d" fi done

解决办法:

1、修改对应应用的Djava.io.tmpdir参数,统一使用/tmp目录。重启应用

2、修改/etc/cron.daily/tmpwatch

/usr/sbin/tmpwatch "$flags" -x /tmp/hsperfdata_* -x /tmp/.X11-unix -x /tmp/.XIM-unix

-x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix 240 /tmp

[root@node1 ~]# jmap -F -dump:live,format=b,file=hprof.dump 2712Attaching to process ID 2712, please wait...

Debugger attached successfully.

Server compiler detected.

JVM version is 25.201-b09

Dumping heap to hprof.dump ...

Heap dump file created

dump.hprof这个后缀是为了后续可以直接用MAT(Memory Anlysis Tool)打开。

-finalizerinfo :打印等待回收对象的信息

[root@node1 ~]# jmap -finalizerinfo 2712Attaching to process ID 2712, please wait...

Debugger attached successfully.

Server compiler detected.

JVM version is 25.201-b09

Number of objects pending for finalization: 0可以看到当前F-QUEUE队列中并没有等待Finalizer线程执行finalizer方法的对象。

-heap :打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况,可以用此来判断内存目前的使用情况以及垃圾回收情况

[root@node1 ~]# jmap -heap 2712Attaching to process ID 2712, please wait...

Debugger attached successfully.

Server compiler detected.

JVM version is 25.201-b09

using thread-local objectallocation.

Parallel GC with 2thread(s) # GC方式

Heap Configuration: // 堆内存初始化配置

MinHeapFreeRatio = 0 // 对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)

MaxHeapFreeRatio = 100 // 对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)

MaxHeapSize = 52428800 (50.0MB) // 对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小

NewSize = 17301504 (16.5MB) // 对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小

MaxNewSize = 17301504 (16.5MB) // 对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小

OldSize = 35127296 (33.5MB) // 对应jvm启动参数-XX:OldSize=:设置JVM堆的‘老生代’的大小

NewRatio = 2 // 对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率

SurvivorRatio = 8 // 对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值

MetaspaceSize = 21807104 (20.796875MB) // 对应jvm启动参数-XX:PermSize=:设置JVM堆的‘永生代’的初始大小

CompressedClassSpaceSize = 1073741824 (1024.0MB) // 对应jvm启动参数-XX:MaxPermSize=:设置JVM堆的‘永生代’的最大大小

MaxMetaspaceSize = 17592186044415MB

G1HeapRegionSize = 0 (0.0MB)

Heap Usage: // 堆内存使用情况

PS Young Generation

Eden Space: // Eden区内存分布

capacity = 9961472 (9.5MB) // Eden区总容量

used = 3917840 (3.7363433837890625MB) // Eden区已使用

free = 6043632 (5.7636566162109375MB) // Eden区剩余容量

39.32993035567434% used // Eden区使用比率

From Space: // 其中一个Survivor区的内存分布

capacity = 3670016 (3.5MB)

used = 1028528 (0.9808807373046875MB)

free = 2641488 (2.5191192626953125MB)

28.025163922991073%used

To Space: // 另一个Survivor区的内存分布

capacity = 3145728 (3.0MB)

used = 0 (0.0MB)

free = 3145728 (3.0MB)

0.0%used

PS Old Generation // 当前的Old区内存分布

capacity = 35127296 (33.5MB)

used = 27684384 (26.401885986328125MB)

free = 7442912 (7.098114013671875MB)

78.81159995918843%used

20704 interned Strings occupying 2153624 bytes.

-histo :打印堆的对象统计,包括对象数、内存大小等等 (因为在dump:live前会进行full gc,如果带上live则只统计活对象,因此不加live的堆大小要大于加live堆的大小 )

[root@node1 ~]# jmap -F -histo 2656num #instances #bytes Class description

--------------------------------------------------------------------------

1: 526458 45456832 char[]

2: 275076 6601824java.lang.String

3: 44613 5271264 byte[]

4: 215455 5170920java.util.concurrent.ConcurrentSkipListMap$Node

5: 62357 4515576 int[]

6: 109775 2634600java.lang.Double

7: 74848 2395136java.util.HashMap$Node

8: 18442 1880400java.util.HashMap$Node[]

9: 53471 1820904java.lang.Object[]

....

仅仅打印了前10行

xml classname是对象类型,说明如下:

B byteC charD doubleF floatI intJ longZ boolean

[ 数组,如[I表示int[]

[L+类名 其他对象

-F :强制模式。如果指定的pid没有响应,请使用jmap -dump或jmap -histo选项。此模式下,不支持live子选项

另外,jmap命令生成的hprof文件可以使用jhat进行分析

java 内存泄露 jmap_jmap命令 检查内存泄漏相关推荐

  1. vs调试c语言检查内存泄露,VisualStudio中检查内存泄露方法

    项目工程中存在内存泄露,被折磨了一晚上,终于查了出来,因为之前没有相关的经验,还比较生疏,在此记录下来,方便以后查找. 对于malloc出的内存的检测方法 这篇文章中详细地记录了从检查到找到确定位置到 ...

  2. java 内存泄露 书籍_java虚拟机内存溢出和泄漏实例

    测试参数设置: 1.循环调用new A()实现堆溢出,java.lang.OutOfMemoryError: Java heap space, 虚拟机参数:-Xms1M -Xmx1M -XX:+Hea ...

  3. 【内存泄露】Memory Leaks 内存优化

    什么是内存泄露 内存管理一直是Java 所鼓吹的强大优点.开发者只需要简单地创建对象,而Java的垃圾收集器将会自动管理内存空间的分配和释放. 但在很多情况下,事情并不那么简单,在 Java程序中总是 ...

  4. android中内存泄露,Android中的内存泄露

    编辑推荐: 本文来自于csdn,本文主要从java的内存模型讲起,最终举出几个内存泄露的例子和解决方案. java运行时内存模型 具体信息:http://gityuan.com/2016/01/09/ ...

  5. leaks Android内存泄露,Android LeakCanary 检测内存泄露

    内存泄漏: 指程序在申请内存后 ,无法释放已经申请的内存空间,一次内存泄漏可以忽略,但内存泄漏堆积后果很严重,无论多少内存,都会被占光 内存泄露危害: 1.内存泄露最终会导致内存溢出(OOM) 2.导 ...

  6. 什么是内存泄露,如何避免内存泄露 C++

    定义 内存泄露(memory lock)是指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况. 进一步解释 内存泄露其实并非指内存再物理上的小时,而是在应用程序分配某段内存后,由于涉及错误,死去 ...

  7. java 内存泄露监控,Linux下实用的JAVA内存泄露监控命令

    内存泄露一直是比较头疼的事情,下面三个命令我个人觉得相当有用. 1.jstack (linux下特有) 可以观察到jvm中当前所有线程的运行情况和线程当前状态 jstack 2083 输出内容如下: ...

  8. js内存泄露 垃圾回收_Java内存体系结构(模型),垃圾回收和内存泄漏

    js内存泄露 垃圾回收 Java内存架构(Java内存模型) 上面是堆的Java内存模型以及Java虚拟机(JVM)中运行的任何Java应用程序的PermGen. 还提供了比率,以使您更好地了解如何在 ...

  9. 内存泄露严重吗_内存泄漏–测量频率和严重性

    内存泄露严重吗 这篇文章是我们开放文化的一部分-我们将继续分享日常工作中的见解. 这次,我们窥视了我们价值主张的核心,即–寻找以下问题的答案: Java应用程序中内存泄漏多久发生一次? 内存泄漏有多大 ...

最新文章

  1. 计算机冒泡排序教学,绵竹职中计算机给冒泡排序教案.doc
  2. 电商前端设计-详情页
  3. 4部“教材级”纪录片,有生之年必看系列!
  4. 济宁医学院计算机专业好就业吗,山东这3所医学院实力强,就业率高,中等生可捡漏...
  5. c语言 字符串 url,如何对URL字符串进行百分号编码
  6. Step By Step (zz from UESTC)
  7. pythonwin是什么_winpython是什么
  8. Python入门--类的创建
  9. MySQL数据库反向生成powerdesigner模型
  10. lottie动画_极光小课堂 | 用 Lottie 实现超炫酷动画
  11. cmake和make区别
  12. 测试显卡风扇的软件,让噪音远离,显卡风扇转速调节
  13. Hive之窗口函数(一文搞懂)
  14. Android 分贝测试仪功能,挥泪整理面经
  15. 一文搞懂基因融合(gene fusion)的定义、产生机制及鉴定方法
  16. Matlab操作excel格式文件
  17. 克拉克变换(Clarke Transformation)逆变换矩阵的求法
  18. void func()与 func(void)的区别
  19. 腾讯十大开源项目,最后一个太受欢迎了!
  20. 生产系统搭建spark,基础环境注意事项

热门文章

  1. 【Flink】Flink 控制台能消费 但是 Flink 任务不能消费 内置topic 导致问题
  2. 【算法】算法 二分查找 二分查找 查找多个相同的值
  3. 【Jvm】jvm -XX 参数 VM 调优参数
  4. 【Kafka】kafka检查消费者位置
  5. Spring : 基于tx标签的声明式事物
  6. Java中的switch分支语句
  7. 工作不饱和 ? 给你 8 个程序员接私活的网站
  8. C#抽象类和抽象方法
  9. java ee 员工管理系统,fb3492 javaEE_原生Servlet_MySql企业员工信息管理系统的设计与实现,java源码含论文与答辩PPT...
  10. 计算机内页动画的作用是什么,滑环工作原理动画示意图有什么作用?