用Java检查内存布局

时间:2013-01-29 17:29:58

标签: 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 */ }

并在对象ab中实例化这些类。

是否有一个工具可用于分析内存使用情况并确切地查看为这些内存分配的内存?

谢谢!

3 个答案:

答案 0 :(得分:10)

自原始问题发布以来,情况发生了一些变化。

jol 工具(“java对象布局”,由Aleksey Shipilev提供),现在是OpenJDK的一部分,允许您检查实际的内存布局和类的用法。 http://openjdk.java.net/projects/code-tools/jol/

示例输出如下所示:

$ 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

答案 1 :(得分:2)

我认为首先要有一个关于如何在某些操作系统上运行JVM的图像是有益的,所以看看The Java Virtual Machine。此外,相关问题是https://softwareengineering.stackexchange.com/questions/151076/approaching-java-jvm-internals

答案 2 :(得分:0)

不,不存在此类工具,但this article解释了内存布局如何工作的基础知识。 OpenJDK的。 (值得注意的是,类中的其他方法在该类的实例中占用零开销。)