`
langzi_xl
  • 浏览: 23055 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

jmap -dump:live为啥会触发Full GC

    博客分类:
  • Java
阅读更多

昨天组里的新人小朋友问是不是每执行一次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堆栈文件分析工具

    例如,`jmap -dump:format=b,file=heapdump.hprof <Pid>`会将指定进程的堆内存转储到`heapdump.hprof`文件中。 生成堆转储文件后,我们通常会使用专门的内存分析工具来解析和分析这些数据,以发现可能存在的内存...

    JMAP-Server:如http所指定的JMAP服务器的实现

    npm install -g jmap-server 用法 首先启动服务器: jmap-server 然后,您可以在测试一些请求: curl -d "@examples/mailboxes/setMailboxes.json" -H "Content-Type: application/json" http://127.0.0.1:3000...

    MemoryAnalyzer-1.9.1.20190826-linux.gtk.x86_64.zip

    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 ...

    jmap Eclipse内存分析工具.rar

    1. **生成堆转储(Heap Dump)**: 使用`jmap -dump`命令,可以在运行时将Java堆的完整状态导出为一个二进制文件,通常以`.hprof`为扩展名。 2. **堆统计信息**: `jmap -histo`可以打印出堆中对象的数量和大小的直方...

    jmap+EclipseMAT:排查内存泄漏的好工具.pdf

    Jmap+EclipseMAT 排查内存泄漏的好工具 Jmap 和 EclipseMAT 是两种非常有用的工具,用于排查 Java 应用程序中的内存泄漏问题。下面是对这两个工具的详细介绍和使用方法。 Jmap Jmap 是一个命令行工具,用于输出 ...

    jvm信息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使用详解.docx

    JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解 本文将对一些常用的 JVM 性能调优监控工具进行介绍,包括 jps、jstack、jmap、jhat、jstat 等工具的使用详解。这些工具对于 Java 程序员来说是必备的,...

    java使用JMAP定位代码内存泄漏在哪

    2. **查看堆概要**:`jmap -histo:live <pid>`命令可以显示堆内存中对象的数量和大小的分布,帮助我们了解哪些类消耗了最多的内存。 3. **GC日志分析**:`jmap -heap <pid>`可以输出JVM的堆配置信息以及垃圾收集的...

    weblogic参数.txt

    - **说明**:这些参数与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 文件,发现有很明显的内存泄漏提示。点击查看详情,发现定位到了代码的...

    使用jmap分析Java程序性能问题

    使用`-dump`选项,jmap可以将当前的堆内存状态导出为一个文件。这种快照文件通常会被其他工具如MAT(Memory Analyzer Tool)或VisualVM用来进行更深入的分析。这种方法对于解决复杂的内存问题特别有效,因为它允许在...

    学习tomcat的内存泄漏

    Tomcat内存泄漏定位实战 verbosegc,将GC输出到gc.log文件中 ... jmap -dump:live,format = b,file = 94223.bin 94223 用Eclipse Memory Analyzer:转储文件,通过内存泄漏分析,得到这样一个分析报告

    java性能分析 jmap jstack

    需要注意的是,在使用CMS GC时,执行此命令可能会导致Java进程暂时挂起。 ##### 2.3 查看JVM堆中对象的详细占用情况 ```bash jmap -histo [pid] ``` 此命令可以帮助我们了解每个类实例的数量和所占的内存大小,从而...

    JMAP的JavaScript客户端JMAP-JS.zip

    JMAP-JS 是 JMAP 邮件,联系人和日历模型的 JavaScript 实现,是 JMAP 的 JavaScript 客户端。 标签:JMAPJS

    10.JVM常见命令1

    * -gccause:与-gcutil 功能一样,但是会额外输出导致上一次 GC 产生的原因。 * -gcnew:监控新生代情况。 * -gcnewcapacity:监控新生代最大、最小的空间使用情况。 * -gcold:监控老年代情况。 * -gcoldcapacity:...

    MemoryAnalyzer-1.10.0.20200225-win32.win32.x86_64.zip

    通过jmap 导出文件,对jvm...JVM 内存分析软件,查看jvm 内存是否泄漏,那个class 内存泄漏,通过java 命令 jmap -dump:live,format=b,file=${文件路径}/xxx.bin 进程ID 导出bin 文件,用该软件进行对bin文件进行分析

    针对jvm参数进行调优,针对堆栈信息进行dump,使用visualVm查看-JvmTest.zip

    当应用出现性能问题或异常时,可以使用`jmap`命令来dump出JVM的堆栈信息,命令格式通常为 `jmap -dump:format=b,file=<dump_file> <pid>`,其中`<pid>`是Java进程的ID,`<dump_file>`是生成的dump文件名。...

    jmap-client-ts:TypeScript中的JMAP 1.0客户端库

    jmap-client-ts 用编写的 Client。 如何使用它 导入项目(在package.json ),您可以引用提交或分支以使用快照版本。 创建客户端 let client = new Client ( { accessToken : 'myToken' , sessionUrl : '...

    开发常见jvm问题调优.doc

    - `-XX:MetaspaceSize` 设定了元空间触发 FullGC 的初始阈值,这个值会在每次FullGC之后根据释放空间的多少自动调整。 - **作用**: - 对于元空间的管理,建议将 `-XX:MetaspaceSize` 和 `-XX:MaxMetaspaceSize` ...

Global site tag (gtag.js) - Google Analytics