手册页说
If the given process is running on a 64-bit VM, you may need to specify the -J-d64 option
就是这样。一些堆转储指南确实包含它,但没有解释。
更具体地说,我试图弄清楚不指定该选项是否可能会损坏我的堆转储(jhat 无法读取它们)。盲目试验的成本很高,因为堆很大,系统是 Activity 的,并且在运行过程中有特定的点需要转储。
最佳答案
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
启动java -d64
,使用64位模型而不是32位模型一点。
如果您运行 jmap
的进程不是 64 位 JVM,请勿传递 -J-d64
参数。
编辑,因为我已经做了很多 jmap
/jhat
来排除故障
当您说损坏时,您的意思是 jhat
实际上报告了损坏的堆转储吗?或者是因为你的堆转储太大而无法读取? jhat 将尝试将整个转储加载到内存中,因此您至少需要与转储大小一样多的可用内存。您可能需要将 -Xmx
指定为 jhat
,以及 J-d64
以增加堆空间。
我使用的更好的替代方案是 Eclipse Memory Analyzer Tool ,它选择性地加载堆转储而不是预加载所有内容。对于我来说,它在 6+ GB 堆转储上比 jhat
好得多。
关于java - jmap 堆转储实用程序的选项 "-J-d64"有何作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7920556/