手册页说
如果给定进程在 64 位 VM 上运行,则可能需要指定 -J-d64 选项
就是这样。一些堆转储方法确实包括它,没有解释。
更具体地说,我想弄清楚是否不指定该选项可能会破坏我的堆转储(jhat 无法读取它们)。盲目试验成本高昂,因为堆很大,系统是实时的,并且在操作过程中我需要转储的特定点。
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我好得多。
| 归档时间: |
|
| 查看次数: |
2657 次 |
| 最近记录: |