6

私は継承を実験しており、教育目的で、さまざまなオブジェクトに割り当てられたアドレスとオブジェクト内のフィールドを調べたいと思っています。JVMが使用しているメモリとその使用目的を確認できるツールはありますか?

たとえば、2つのクラスがある場合:

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

メモリ使用量をプロファイリングし、これらに割り当てられているメモリを正確に確認するために使用できるツールはありますか?

ありがとうございました!

4

3 に答える 3

15

元の質問が投稿されたので、状況は少し変わりました。

jolツール(Aleksey Shipilevによる「javaオブジェクトレイアウト」)が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
于 2014-01-19T03:20:14.150 に答える
2

あるオペレーティングシステム上でJVMがどのように機能するかについてのイメージを最初に持っていることは有益だと思うので、Java仮想マシンを見てください。また、関連する質問はhttps://softwareengineering.stackexchange.com/questions/151076/approaching-java-jvm-internalsです。

于 2013-01-29T17:41:42.487 に答える
0

いいえ、そのようなツールは存在しませんが、この記事では、OpenJDKなどでメモリレイアウトがどのように機能するかの基本について説明します。(特に、クラス内の追加のメソッドは、そのクラスのインスタンスでオーバーヘッドをゼロにします。)

于 2013-01-29T17:33:36.403 に答える