用Java检查内存布局

用Java检查内存布局,java,memory-management,Java,Memory Management,我正在试验继承,出于教育目的,我想检查分配给各种对象的地址以及对象中的字段。是否有一个工具可以让我看到JVM正在使用什么内存以及它在使用它做什么 例如,如果我有两个类: class A { int i,j; int f { ...} } class B extends A { int c; /* more methods, overriding f and declaring new ones as well */ } 并在对象a和b中实例化这些类 是否有一个工具可以用来分析内存使用情况,并准

我正在试验继承,出于教育目的,我想检查分配给各种对象的地址以及对象中的字段。是否有一个工具可以让我看到JVM正在使用什么内存以及它在使用它做什么

例如,如果我有两个类:

class A { int i,j; int f { ...} }
class B extends A { int c; /* more methods, overriding f and declaring new ones as well */ }
并在对象
a
b
中实例化这些类

是否有一个工具可以用来分析内存使用情况,并准确查看为这些配置了哪些内存


谢谢大家!

不,不存在这样的工具,不过解释了内存布局在OpenJDK中的工作原理。(值得注意的是,一个类中的附加方法在该类的实例中不会产生任何开销。)

我想首先了解JVM如何在某个操作系统上运行是有指导意义的,所以请看一看。另外,一个相关的问题是

,因为原来的问题已经发布了,所以情况发生了一些变化

jol工具(“java对象布局”,Aleksey Shipilev)现在是OpenJDK的一部分,它允许您检查实际的内存布局和类的使用情况

示例输出如下所示:

$ java -jar jol-cli/target/jol-internals.jar java.util.HashMap
  Running 64-bit HotSpot VM.
  Using compressed references with 3-bit shift.
  Objects are 8 bytes aligned.
  Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
  Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]

  java.util.HashMap object internals:
   OFFSET  SIZE       TYPE DESCRIPTION                    VALUE
        0     4            (object header)                01 00 00 00 (00000001 00000000 00000000 00000000)
        4     4            (object header)                00 00 00 00 (00000000 00000000 00000000 00000000)
        8     4            (object header)                0f 0f 3e e0 (00001111 00001111 00111110 11100000)
       12     4        Set AbstractMap.keySet             null
       16     4 Collection AbstractMap.values             null
       20     4        int HashMap.size                   0
       24     4        int HashMap.threshold              16
       28     4      float HashMap.loadFactor             0.75
       32     4        int HashMap.modCount               0
       36     4        int HashMap.hashSeed               0
       40     4    Entry[] HashMap.table                  []
       44     4        Set HashMap.entrySet               null
  Instance size: 48 bytes (estimated, add this JAR via -javaagent: to get accurate result)
  Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

是什么让您认为您可以“覆盖”字段?您不能,仅供参考。另请参见@LouisWasserman,我相信
int f{…}
表示一个(包私有)方法,它可以被重写。@LouisWasserman您是说“f”吗?这是一种方法。按类型划分的字段大小:4,1,1,2,2,4,4,4,4,8[字节]数组元素大小:4,1,1,2,2,4,4,4,8,8[字节]这是什么?@Andreyua大小:对象引用,布尔值,字节,字符,短,int,浮点,长,双精度