当前位置:首页 > 内存 > 正文

jmap dump内存的命令

  • 内存
  • 2024-08-25 23:38:18
  • 208

一、如何获取javaheapdumpC:/ProgramFiles/Java/jdk1.6.0_20/bin>jmap
用法:
jmap-histo
(连接正在运行的进程和Java对象堆的直方图打印
jmap-dump:
(toconnecttorunningprocessanddumpjavaheap)
dump-options:
format=bbinarydefault
file=dumpheapto
示例:jmap-dump:format=b,file=
或者运行jconsole并选择MBeans->ment->HotSpotDiagnostic->Operations->dumpHeap中from在p0参数中输入保存转储文件的路径如果要使用EclipseMemoryAnalyzer进行分析,文件的后缀必须为hprof点击dumpHeap按钮即可。生成转储文件直接在EclipseMemoryAnalyzer中生成或者设置JVM在没有内存时自动生成转储文件:-XX:+HeapDumpOnOutOfMemoryError或-XX:+
二、jmap命令的实现原理解析当服务中出现GC问题时,一般都会使用跳转工具进行分析,所以各个方面的了解很重要。
使用histo选项打印当前Java堆中每个对象的数量和大小。
如果直接添加,则只会打印活动对象。
使用-dump选项将Java堆中的对象转储到本地文件并使用MAT来解析它们。
如果直接添加,则仅删除活动对象。
使用-heap选项打印Java堆结构和使用情况,以及使用的GC算法。
使用-finalizerinfo选项打印终结器方法的挂起执行。
使用-permstat选项打印Java堆持久代信息,包括类加载器相关信息和交错字符串信息。
jump与jvm通信有两种实现方式:attach和SA。
bind方法简单来说就是客户端和服务端的连接,客户端发送请求,主要逻辑在服务端执行,JVM相当于服务器。
在JVM中,有一个名为“AttachmentListener”的线程,负责监听附件请求并执行相关任务。
例如,如果现在运行“jmap-histo:live5409”,则分步实现如下:
1在类的main函数中,解析参数。2.如果解析的参数中存在“-histo:live”,则执行histo方法:
attach方法在跳转进程和JVM之间建立套接字连接。请参阅设置过程。
这里的live参数为true,因为命令行中添加了[:live]选项。
重温heaphisto方法
executeCommand方法根据之前的socket连接向JVM发送一个“inspectheap”命令,当然还有参数。
当虚拟机的“附加侦听器”线程接收到新命令时,它会释放它来处理它。
该命令与特殊函数的关系如下:
stack_inspect方法对应“inspect”,其实现如下:
VM_GC_HeapInspection中的Doit方法
_full_gc的值为live_object_only,如果为true,则可以执行一次fullgc来清理不活动的对象,但这可能是原因。GLocker这会导致GC被跳过。
“jump-dump”的实现原理与“jump-histo”相同,都是通过附件实现的。客户端连接到目标JVM并向其发出相同的命令
2.3.客户端接收返回的文本并显示;
通过标签解析,如果参数为“-heap|-heap:format=b|-permstat|-finalizerinfo”之一或添加“-F”,例如“jmap-histo”-F5409”,SA使用方法。
SA方法与bind方法不同,因为相关的核心逻辑是在SA中实现的,并且可以从JVM访问数据。实现类是“HeapSummary”,内部绑定了BugSpotAgent工具类,具体请参见HotSpotServiceabilityAgent实现总结
执行跳转堆有时可以T进程。通常会有一个线程等待当所有其他线程都被阻塞时,可以执行kill-CONT继续接收响应,但仍然强烈建议不要执行该命令。