Java内存分析工具——jmap
平时我们在开发Java应用的时候,会涉及到分析对象内存、内存监控,那么就涉及到jmap这个工具,学习后来介绍一下
能干嘛?
jmap 一般可用于:
- jmap能够打印给定Java进程、核心文件或远程DEBUG服务器的共享对象内存映射或堆内存的详细信息
- 内存监控
- 分析对象内存
示例:
怎么用?
jmap 相关命令:
可通过 jmap –help 查看
- jmap [option] :连接运行的进程 ,分析内存情况
- jmap [option] <executable :分析 core dump文件
- jmap [option] [server_id@] :连接到远程的服务器进行分析
- jmap -help / java -h : 查看帮助信息
1、jmap [option]
**jmap [option] **
pid
: 可通过 jps 或者 ps 获得
示例如上面 示例图 一样,用ps 查询到java 的进程号 25488 ,然后 jmap 25488 查看到当前进程的相关信息
2、jmap [option] <executable
jmap [option] <executable
executable
: 生成核心转储的Java可执行文件。core
: 要打印配置信息的核心文件
3、jmap [option] [server_id@]
server-id
: 当很多debug服务在远程跑的时候,这个服务的唯一 IDremote-hostname-or-IP
: 远程服务的IP或者hostname
4、[option]
- -dump: :生成Java堆快储快照,如下
- live:仅将存活得对象dump出
- format:编码格式
- file :生成得文件名称
- -finalizerinfo :显示出等待执行 finalize方法得对象
- -heap : 显示Java堆详细信息
- -histo[:live] :显示堆中对象的详细信息,如果加了live,只显示 存活 得对象信息
- -clstats :显示出加载器静态对象
常用命令:
jmap [pid] # 查看具体情况
jmap -dump:live,format=b,file=xxx.xxx [pid] #将当前Java进程的内存占用情况导出来
jmap -histo:live [pid] >a.log # 显示 存活 得对象信息
jmap -finalizerinfo [pid] # 查看 等待执行finalize 方法的数量
jmap -heap [pid] # 堆摘要信息
示例:(这里有一个Java 应用,pid为 25488)
1、jmap -heap [pid] : 显示堆的详细信息
执行:
jmap -head 25488
执行情况,显示二个主要的信息
- 堆的配置(Heap Configuration)
- 堆使用(Heap Usage)(新生代、老年代)
2、jmap -finalizerinfo [pid] : 查看 等待执行finalize 方法的数量
执行:
jmap -finalizerinfo 25488
执行情况,显示待执行 finalize 方法的对象数量
3、jmap -dump:live,format=b,file=xxx.xxx [pid] #将当前Java进程的内存占用情况导出来
执行:
jmap -dump:live,format=b,file=/home/lms/a.txt 25488
执行情况,在指定路径下生成指定快照文件 a.txt,生成的文件可以用 jhat 工具来进行分析
生成的文件用jhat来分析, 默认开启端口7000
可以根据 ip:7000 来查看:
4、jmap -histo:live [pid] >a.log #将当前Java进程的内存占用情况导出来
执行:
jmap -histo:live 25488 >/home/lms/a.log
执行情况,在指定路径下生成指定导出文件a.log
查看该文件内容:
常用JVM参数:
-Xms:初始堆大小,默认为物理内存的1/64(<1GB);默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制
-Xmx:最大堆大小,默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制
-Xmn:新生代的内存空间大小,注意:此处的大小是(eden+ 2 survivor space)。与jmap -heap中显示的New gen是不同的。整个堆大小=新生代大小 + 老生代大小 + 永久代大小。在保证堆大小不变的情况下,增大新生代后,将会减小老生代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-XX:SurvivorRatio:新生代中Eden区域与Survivor区域的容量比值,默认值为8。两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10。
-Xss:每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。应根据应用的线程所需内存大小进行适当调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。一般小的应用, 如果栈不是很深, 应该是128k够用的,大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。和threadstacksize选项解释很类似,官方文档似乎没有解释,在论坛中有这样一句话:"-Xss is translated in a VM flag named ThreadStackSize”一般设置这个值就可以了。
-XX:PermSize:设置永久代(perm gen)初始值。默认值为物理内存的1/64。
-XX:MaxPermSize:设置持久代最大值。物理内存的1/4。
相关链接
1、若使用报错,请查看 另外一篇博客
Error attaching to process sun.jvm.hotspot.debugger.DebuggerException cannot open binary file
2、官方文档
3、jinfo
版权声明:本文为weixin_42272869原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。