手册页说
如果给定进程在64位VM上运行,则可能需要指定-J-d64选项
就是这样。一些堆转储howtos确实包含它,没有解释。
更具体地说,我试图弄清楚如果没有指定该选项可能会破坏我的堆转储(jhat无法读取它们)。盲目地进行实验是昂贵的,因为堆很大,系统是实时的,并且在操作期间我需要转储的特定点。
答案 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以上的堆转储要好得多。