java 内存泄露 jmap_jmap命令 检查内存泄漏
命令介绍
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命令 检查内存泄漏相关推荐
- vs调试c语言检查内存泄露,VisualStudio中检查内存泄露方法
项目工程中存在内存泄露,被折磨了一晚上,终于查了出来,因为之前没有相关的经验,还比较生疏,在此记录下来,方便以后查找. 对于malloc出的内存的检测方法 这篇文章中详细地记录了从检查到找到确定位置到 ...
- java 内存泄露 书籍_java虚拟机内存溢出和泄漏实例
测试参数设置: 1.循环调用new A()实现堆溢出,java.lang.OutOfMemoryError: Java heap space, 虚拟机参数:-Xms1M -Xmx1M -XX:+Hea ...
- 【内存泄露】Memory Leaks 内存优化
什么是内存泄露 内存管理一直是Java 所鼓吹的强大优点.开发者只需要简单地创建对象,而Java的垃圾收集器将会自动管理内存空间的分配和释放. 但在很多情况下,事情并不那么简单,在 Java程序中总是 ...
- android中内存泄露,Android中的内存泄露
编辑推荐: 本文来自于csdn,本文主要从java的内存模型讲起,最终举出几个内存泄露的例子和解决方案. java运行时内存模型 具体信息:http://gityuan.com/2016/01/09/ ...
- leaks Android内存泄露,Android LeakCanary 检测内存泄露
内存泄漏: 指程序在申请内存后 ,无法释放已经申请的内存空间,一次内存泄漏可以忽略,但内存泄漏堆积后果很严重,无论多少内存,都会被占光 内存泄露危害: 1.内存泄露最终会导致内存溢出(OOM) 2.导 ...
- 什么是内存泄露,如何避免内存泄露 C++
定义 内存泄露(memory lock)是指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况. 进一步解释 内存泄露其实并非指内存再物理上的小时,而是在应用程序分配某段内存后,由于涉及错误,死去 ...
- java 内存泄露监控,Linux下实用的JAVA内存泄露监控命令
内存泄露一直是比较头疼的事情,下面三个命令我个人觉得相当有用. 1.jstack (linux下特有) 可以观察到jvm中当前所有线程的运行情况和线程当前状态 jstack 2083 输出内容如下: ...
- js内存泄露 垃圾回收_Java内存体系结构(模型),垃圾回收和内存泄漏
js内存泄露 垃圾回收 Java内存架构(Java内存模型) 上面是堆的Java内存模型以及Java虚拟机(JVM)中运行的任何Java应用程序的PermGen. 还提供了比率,以使您更好地了解如何在 ...
- 内存泄露严重吗_内存泄漏–测量频率和严重性
内存泄露严重吗 这篇文章是我们开放文化的一部分-我们将继续分享日常工作中的见解. 这次,我们窥视了我们价值主张的核心,即–寻找以下问题的答案: Java应用程序中内存泄漏多久发生一次? 内存泄漏有多大 ...
最新文章
- 计算机冒泡排序教学,绵竹职中计算机给冒泡排序教案.doc
- 电商前端设计-详情页
- 4部“教材级”纪录片,有生之年必看系列!
- 济宁医学院计算机专业好就业吗,山东这3所医学院实力强,就业率高,中等生可捡漏...
- c语言 字符串 url,如何对URL字符串进行百分号编码
- Step By Step (zz from UESTC)
- pythonwin是什么_winpython是什么
- Python入门--类的创建
- MySQL数据库反向生成powerdesigner模型
- lottie动画_极光小课堂 | 用 Lottie 实现超炫酷动画
- cmake和make区别
- 测试显卡风扇的软件,让噪音远离,显卡风扇转速调节
- Hive之窗口函数(一文搞懂)
- Android 分贝测试仪功能,挥泪整理面经
- 一文搞懂基因融合(gene fusion)的定义、产生机制及鉴定方法
- Matlab操作excel格式文件
- 克拉克变换(Clarke Transformation)逆变换矩阵的求法
- void func()与 func(void)的区别
- 腾讯十大开源项目,最后一个太受欢迎了!
- 生产系统搭建spark,基础环境注意事项
热门文章
- 【Flink】Flink 控制台能消费 但是 Flink 任务不能消费 内置topic 导致问题
- 【算法】算法 二分查找 二分查找 查找多个相同的值
- 【Jvm】jvm -XX 参数 VM 调优参数
- 【Kafka】kafka检查消费者位置
- Spring : 基于tx标签的声明式事物
- Java中的switch分支语句
- 工作不饱和 ? 给你 8 个程序员接私活的网站
- C#抽象类和抽象方法
- java ee 员工管理系统,fb3492 javaEE_原生Servlet_MySql企业员工信息管理系统的设计与实现,java源码含论文与答辩PPT...
- 计算机内页动画的作用是什么,滑环工作原理动画示意图有什么作用?