jmap堆转储实用程序的选项“-J-d64”有什么作用?

时间:2011-10-27 18:28:04

标签: java

手册页说

  

如果给定进程在64位VM上运行,则可能需要指定-J-d64选项

就是这样。一些堆转储howtos确实包含它,没有解释。

更具体地说,我试图弄清楚如果没有指定该选项可能会破坏我的堆转储(jhat无法读取它们)。盲目地进行实验是昂贵的,因为堆很大,系统是实时的,并且在操作期间我需要转储的特定点。

1 个答案:

答案 0 :(得分:4)

jmap的帮助信息片段:

λ > jmap 
Usage:
    jmap [option] <pid>
        (to connect to running process)
    jmap [option] <executable <core>
        (to connect to a core file)
    jmap [option] [server_id@]<remote server IP or hostname>
        (to connect to remote debug server)

where <option> is one of:
    <none>               to print same info as Solaris pmap
    -heap                to print java heap summary
    ... stuff ...
    -J<flag>             to pass <flag> directly to the runtime system

所以你看到-J标志直接将参数传递给JVM。

查看jvm帮助消息:

λ > java
Usage: java [-options] class [args...]
           (to execute a class)
   or  java [-options] -jar jarfile [args...]
           (to execute a jar file)

where options include:
    -d32          use a 32-bit data model if available
    -d64          use a 64-bit data model if available (implies -server, only for x86_64)

所以jmap -J-d64确实告诉jmap使用64位模型而不是32位来启动java -d64

如果您运行jmap的进程不是64位JVM,请不要传递-J-d64参数。

编辑,因为我已经完成了很多jmap / jhat进行问题排查

当你说损坏时,你的意思是jhat实际上报告了一个损坏的堆转储吗?或者是因为您的堆转储太大而无法读取? jhat将尝试将整个转储加载到内存中,因此您至少需要与转储大小一样多的可用内存。您可能需要将-Xmx指定为jhat,以及J-d64以增加堆空间。

我使用的更好的替代方法是Eclipse Memory Analyzer Tool,它可以选择性地加载堆转储而不是预加载所有内容。比jhat对我来说,6 GB以上的堆转储要好得多。