5

当我在 jmap 命令下运行时:

jmap -histo 14104

我能够看到我的对象的非常好的输出,有实例,使用的字节。

 num     #instances         #bytes  class name
----------------------------------------------
   1:       1308333      398374280  [C
   2:         55058       84410136  [B
   3:       1548041       49537312  java.lang.ref.Finalizer
   4:       1584594       38030256  java.util.HashMap$Entry
   5:       1327543       31861032  java.lang.String
   6:        765682       25734336  [Ljava.lang.Object;

但不幸的是,这不受 Oracle 支持,并且在最新的 Windows 和 Linux JDK 发行版中不可用。有人可以帮忙推荐jmap的替代品吗?

4

3 回答 3

0

但不幸的是,这不受 Oracle 支持,并且在最新的 Windows 和 Linux JDK 发行版中不可用。

那是不正确的信息。

我运行安装了 OpenJDK Java 11 的 Fedora 29,并且jmap肯定存在:

$ ls -l /usr/bin/jmap
.... /usr/bin/jmap -> /etc/alternatives/jmap
$ ls -l /etc/alternatives/jmap
.... /etc/alternatives/jmap -> /usr/lib/jvm/java-11-openjdk-11.0.4.11-0.fc29.x86_64/bin/jmap

OpenJDK Java 11 可用于 Fedora(当前版本)、CentOS 7 和 8、RHEL 7 和 8、Ubuntu 16.04 和 18.04、Debian 9 等等。

对于 Oracle 发行版,我可以jmap在 Oracle Java 12 SE 文档中查看手册页:

因此可以安全地假设当您安装 Oracle JDK 发行版时该工具将存在。

于 2019-09-22T14:07:40.490 回答
0

首先,在为目录jmap设置所有权限后,在 Windows 10 和 JDK 1.8.0_192 上为我工作。%TMP%\hsperfdata_<username>

jmap其次,您可以使用VisualVM工具代替:

内存采样器模式下的 VisualVM

它有一个Sampler实用程序,可以检查堆直方图。

如果您在左侧列表中没有看到您的 Java 进程,请尝试使用-Dcom.sun.management.jmxremote属性。

于 2018-12-23T21:01:57.497 回答
0

jmap -histo 现在至少适用于 Oracle JDK。您还可以将 Jconsole 用于不同但非常具有描述性的信息。您可以将 Jhat 用于您在上面看到的信息以及浏览器上的许多其他信息。

于 2019-09-22T12:12:16.523 回答