"jmap -histo pid" 到底打印了什么

What does "jmap -histo pid" print exactly

我正在使用命令 "jmap -histo pid",想知道它到底在告诉我什么。

输出类似于:

 num     #instances         #bytes  class name
----------------------------------------------
   1:       2284437      262114728  [C
   2:        686409      124390432  [B
   3:        363878       46799288  <constMethodKlass>
   4:        363878       46590464  <methodKlass>
   5:       1817209       43613016  java.lang.String
   6:         34590       37296528  <constantPoolKlass>
   7:        296302       36673344  [I
   8:         34585       33237656  <instanceKlassKlass>
   9:        248731       21559504  [Ljava.lang.Object;
  10:         28200       19991872  <constantPoolCacheKlass>
  11:        563323       13519752  scala.collection.immutable.$colon$colon
  12:         26813       13103488  <methodDataKlass>
  13:        506968       12167232  scala.collection.immutable.HashSet$HashSet1
  14:        200750       10371320  [Lscala.collection.immutable.HashSet;
  15:        114268        9477096  [Lscala.collection.immutable.HashMap;
  16:         92405        7392400  java.lang.reflect.Method
  17:        200953        6430496  scala.collection.immutable.HashMap$HashMap1

例如:"bytes" 究竟显示了什么?

  1. 是否是该类型每个实例的平均大小
  2. 它是自应用程序启动以来创建的所有对象的总大小
  3. 是否是所有对象堆中当前分配的大小

也许有人可以向我解释什么是“#instances”。

这是按对象 class 分组的当前 Java 堆内容的摘要。

  • #instances是Java堆中给定class(可达和不可达)的对象总数;
  • #bytes 是当前驻留在 Java 堆中的给定 class 的对象的总浅表大小(即它们使用了多少内存,而不是使用了多少内存他们引用的对象)
  • #bytes / #instances 将是给定 class.
  • 对象的平均大小