java - jmap 堆转储实用程序的选项 "-J-d64"有何作用?

标签 java

手册页说

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/

相关文章:

java - 这是使用 Enum 的正确方法吗?

java - Java中定义一个变量类型为另一个变量

java - 使用对象的 float 属性的 compareTo() 方法。它是如何使用的,为什么?

java - 是否可以在策略文件的 Jar 文件名中使用通配符?

JavaFX 使用 TimeLine 暂停程序

java - 创建 csv 文件并作为附件发送

java - Android:加快 Activity 之间的共享元素转换

java - 如何在 Tomcat 中找到 Apache HTTP Server

java - Java 中文件的 nullobject

java - 这个递归函数如何得到这个输出?