1 .jmap简介
jmap是用来查看某一时刻某一个java服务进程的堆状态的工具,可以查看实体加载个数,堆内存中的各个分区信息,可以将这些信息转储为一张堆的快照,由于分析堆溢出问题并研究解决方案。
2.jmap使用场景
- 内存调优,,如果发现打开某个页面特别慢,在排除数据库查询和网络请求因素后可以通过jmap对比网页打开前后的堆情况来帮助分析定位问题。
- 出现堆溢出问题 结合top命令和jmap查看cpu占用率,堆的GC回收情况。
3. jmap语法
- -dump, 生成堆的转存储快照 jmap -dump :live,format=b,file=fileName pid;live:是否只dump出存活的对象。
- -heap ,显示堆的详细信息,主要用来查看堆内划分的分代区状态,jmap -heap pid。
- histo ,显示堆中的对象统计信息,包括类,实例数量和合计容器。
- -F,强制生成快照。
4.实例
- java -dump:format=b,file-dump 19881
n$ jmap dump 19818
Attaching to core 19818 from executable dump, please wait...
Error attaching to core file: cannot open binary file
sun.jvm.hotspot.debugger.DebuggerException: cannot open binary file
at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.attach0(Native Method)
at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.attach(LinuxDebuggerLocal.java:286)
at sun.jvm.hotspot.HotSpotAgent.attachDebugger(HotSpotAgent.java:673)
at sun.jvm.hotspot.HotSpotAgent.setupDebuggerLinux(HotSpotAgent.java:611)
at sun.jvm.hotspot.HotSpotAgent.setupDebugger(HotSpotAgent.java:337)
at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:304)
at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:156)
at sun.jvm.hotspot.tools.Tool.start(Tool.java:191)
at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
at sun.jvm.hotspot.tools.PMap.main(PMap.java:72)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.tools.jmap.JMap.runTool(JMap.java:201)
at sun.tools.jmap.JMap.main(JMap.java:130)
解决方法: 报错原因是因为linux系统禁用了这个与这个命令相关的功能(ptrace_scope),执行 echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
参考资料 https://www.cnblogs.com/wesleyshare/p/9216645.html
可以使用jvisualvm分析快照
- jmap -heap 19818
在图中可以查看,青年代,老年代,临时空间的分布情况(8:1)
- jmap -histo 19818
查看了当前项目的实体数量
5.jConsloe与jvisualvm
这两个工具为jdk自带的支持维护的工具,jvisualvm是官方主推的工具,可以查看dump文件。这两个工具都拥有图形化界面,可以查看项目进程的cpu,内存,实例数量,堆栈的使用情况。jConsloe是基于jmx连接来监测和管理的工具,主要的修改手段是mybean,而jvisualvm除了具有JConsloe的功能外,还具有可扩展的能力,并且监测的功能更加强大。
-
jConsole界面
-
jvisualvm界面