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

Han*_*etz 2 java

手册页说

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

就是这样。一些堆转储方法确实包括它,没有解释。

更具体地说,我想弄清楚是否不指定该选项可能会破坏我的堆转储(jhat 无法读取它们)。盲目试验成本高昂,因为堆很大,系统是实时的,并且在操作过程中我需要转储的特定点。

wkl*_*wkl 5

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
Run Code Online (Sandbox Code Playgroud)

因此,您会看到该-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)
Run Code Online (Sandbox Code Playgroud)

所以jmap -J-d64真的很重要jmap,开始java -d64使用 64 位模型而不是 32 位模型。

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

编辑,因为我已经做了很多jmap/jhat来排除故障

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

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