昨天组里的新人小朋友问是不是每执行一次jmap -dump:live都会触发一次Full GC,因为当时他在做性能测试时某应用已经好几个小时没有一次FGC了,结果他执行了下dump就增加了次FGC。
我当时模糊回答应该会,以前看过哪篇文章好像提过^-^,不过本着严谨不误导新人小朋友的原则,还是找时间抽空验证实践了把:
测试环境:linux , sun jdk 1.6.07 , 32位
测试结果: jmap -dump:live 以及 jmap -histo:live都会触发Full GC,即使加上JVM参数-XX:+DisableExplicitGC也不影响结果
那么为什么呢? 其实大概猜也能知道,live选项的,如果FGC后,看到的活的对象比没有FGC的自然更精确。
我们来通过源码验证学习一下:
入口自然是$j2se/src/share/classes/sun/tools/JMap.java
关键点是
VirtualMachine vm = attach(pid);
InputStream in = ((HotSpotVirtualMachine)vm).
heapHisto(live ? LIVE_OBJECTS_OPTION : ALL_OBJECTS_OPTION);
以及
InputStream in = ((HotSpotVirtualMachine)vm).
dumpHeap((Object)filename,
(live ? LIVE_OBJECTS_OPTION : ALL_OBJECTS_OPTION));
于是找到这里
HotSpotVirtualMachine.java:
public InputStream dumpHeap(Object … args) throws IOException {
return executeCommand(“dumpheap”, args);
}
和
public InputStream heapHisto(Object … args) throws IOException {
return executeCommand(“inspectheap”, args);
}
接着看到
LinuxVirtualMachine.java:
先是创建UNIX socket,然后连到target VM,把dumpheap或inspectheap命令通过socket发过去。
那么具体的inspectheap在sun hotspot核心代码里是如何处理的呢?
看这个 $hotspot/src/share/vm/services/attachListener.cpp
heap_inspection函数有如下关键代码:
VM_GC_HeapInspection heapop(out, live_objects_only /* request full gc */, true /* need_prologue */);
同样dumpheap在hotspot里也是这个文件里处理的:
jint dump_heap(AttachOperation* op, outputStream* out) {
…
// Request a full GC before heap dump if live_objects_only = true
// This helps reduces the amount of unreachable objects in the dump
// and makes it easier to browse.
HeapDumper dumper(live_objects_only /* request GC */);
int res = dumper.dump(op->arg(0));
…
这下我们就明白了,与实验结果也对上号了
参考资料: http://forums.java.net/jive/message.jspa?messageID=115907
分享到:
相关推荐
例如,`jmap -dump:format=b,file=heapdump.hprof <Pid>`会将指定进程的堆内存转储到`heapdump.hprof`文件中。 生成堆转储文件后,我们通常会使用专门的内存分析工具来解析和分析这些数据,以发现可能存在的内存...
npm install -g jmap-server 用法 首先启动服务器: jmap-server 然后,您可以在测试一些请求: curl -d "@examples/mailboxes/setMailboxes.json" -H "Content-Type: application/json" http://127.0.0.1:3000...
jmap -dump:live,format=b,file= java_pid1089.hprof PID 然后,在linux解压后执行以下命令,就生成一个报告: ./ParseHeapDump.sh java_pid1089.hprof org.eclipse.mat.api:suspects org.eclipse.mat.api:overview ...
1. **生成堆转储(Heap Dump)**: 使用`jmap -dump`命令,可以在运行时将Java堆的完整状态导出为一个二进制文件,通常以`.hprof`为扩展名。 2. **堆统计信息**: `jmap -histo`可以打印出堆中对象的数量和大小的直方...
Jmap+EclipseMAT 排查内存泄漏的好工具 Jmap 和 EclipseMAT 是两种非常有用的工具,用于排查 Java 应用程序中的内存泄漏问题。下面是对这两个工具的详细介绍和使用方法。 Jmap Jmap 是一个命令行工具,用于输出 ...
jmap -dump:live,format=b,file=heap.bin ``` 其中`live`表示只导出活动对象,`format=b`指定二进制格式,`file=heap.bin`是输出文件名。 7. **强制dump或histogram**: 当JVM无响应时,可以使用`-F`选项强制...
JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解 本文将对一些常用的 JVM 性能调优监控工具进行介绍,包括 jps、jstack、jmap、jhat、jstat 等工具的使用详解。这些工具对于 Java 程序员来说是必备的,...
2. **查看堆概要**:`jmap -histo:live <pid>`命令可以显示堆内存中对象的数量和大小的分布,帮助我们了解哪些类消耗了最多的内存。 3. **GC日志分析**:`jmap -heap <pid>`可以输出JVM的堆配置信息以及垃圾收集的...
- **说明**:这些参数与Sun JDK类似,但增加了`-Xverboselog`用于指定GC日志的路径,并启用了`-XX:+HeapDumpOnCtrlBreak`功能,允许用户通过Ctrl+Break组合键手动触发Heap Dump。 #### 六、其他实用参数 1. **...
jmap -dump:live,format=b,file=/home/www/jmaplogs/jmap-8001-2.bin 18760 ``` 2.2.4 分析内存快照文件:使用 Memory Analyzer 解析 dump 文件,发现有很明显的内存泄漏提示。点击查看详情,发现定位到了代码的...
使用`-dump`选项,jmap可以将当前的堆内存状态导出为一个文件。这种快照文件通常会被其他工具如MAT(Memory Analyzer Tool)或VisualVM用来进行更深入的分析。这种方法对于解决复杂的内存问题特别有效,因为它允许在...
Tomcat内存泄漏定位实战 verbosegc,将GC输出到gc.log文件中 ... jmap -dump:live,format = b,file = 94223.bin 94223 用Eclipse Memory Analyzer:转储文件,通过内存泄漏分析,得到这样一个分析报告
需要注意的是,在使用CMS GC时,执行此命令可能会导致Java进程暂时挂起。 ##### 2.3 查看JVM堆中对象的详细占用情况 ```bash jmap -histo [pid] ``` 此命令可以帮助我们了解每个类实例的数量和所占的内存大小,从而...
JMAP-JS 是 JMAP 邮件,联系人和日历模型的 JavaScript 实现,是 JMAP 的 JavaScript 客户端。 标签:JMAPJS
* -gccause:与-gcutil 功能一样,但是会额外输出导致上一次 GC 产生的原因。 * -gcnew:监控新生代情况。 * -gcnewcapacity:监控新生代最大、最小的空间使用情况。 * -gcold:监控老年代情况。 * -gcoldcapacity:...
通过jmap 导出文件,对jvm...JVM 内存分析软件,查看jvm 内存是否泄漏,那个class 内存泄漏,通过java 命令 jmap -dump:live,format=b,file=${文件路径}/xxx.bin 进程ID 导出bin 文件,用该软件进行对bin文件进行分析
当应用出现性能问题或异常时,可以使用`jmap`命令来dump出JVM的堆栈信息,命令格式通常为 `jmap -dump:format=b,file=<dump_file> <pid>`,其中`<pid>`是Java进程的ID,`<dump_file>`是生成的dump文件名。...
jmap-client-ts 用编写的 Client。 如何使用它 导入项目(在package.json ),您可以引用提交或分支以使用快照版本。 创建客户端 let client = new Client ( { accessToken : 'myToken' , sessionUrl : '...
- `-XX:MetaspaceSize` 设定了元空间触发 FullGC 的初始阈值,这个值会在每次FullGC之后根据释放空间的多少自动调整。 - **作用**: - 对于元空间的管理,建议将 `-XX:MetaspaceSize` 和 `-XX:MaxMetaspaceSize` ...