Sizeof for Java

オブジェクトのサイズが知りたい!
ゆう時 Cやったら Sizeof なんゆう便利なやつがいてるらしい
が…ってゆう話。

【Q】Javaには Cのsizeof()的なやつはいるん?
【A】いない。
  ってか、なして欲しいん?
  Cプログラマは 自分でデータ構造や割り当てられたメモリをsizeofで知らにゃならんけど
  Javaは 必要ないやろ
  勝手にガーベッジコレクションが動いてくれるけ
  開発者はメモリうんぬんぬんを気にせんでもいいんやから
  確かに C/C++に比べたら Javaは物理メモリを占領しがちになってまうけど
  最近は32-bit JVMが普通やし
  やけ Java開発者は いくらメモリ占有してるかとか膨れすぎてないかとかを
  sizeof とかでチェックするなんゆう必要ないねん

【+】Javaのbasic typeのサイズは決まってるんやからsizeofは必要なか
 どんなJVMやろうがプラットホームやろうがJavaのintは32bit
 ゆうのがjavaの仕様であって開発者が知れる全て
 やけど64-bitのマシンやったら64-bitの物理メモリ使うまうことも
 プリミティブに限らず 参照型も同じこと
 Javaは 物理メモリの制限なんてしとらんねん。配列にしても同じこと

【+】オブジェクトとバイトストリームにシリアライズして その文字列長で オブジェクトのサイズが知れる
 シリアライズは 実際のメモリにあるものを反映したもの
 Stringがどれくらい2バイト文字列でメモリに保持されてるか
 がシリアライズすることで分かるゆうわけ
 シリアライズされた文字列のエンコードがUTF-8かASCII系だった場合は その半分のサイズ

ちなみに
Java Tip 130: Do You Know Your Data Size?: http://www.javaworld.com/javaworld/javatips/jw-javatip130.html

全く同じクラスインスタンスの大量生成での JVMの使用ヒープサイズの増加を測定中
この記事で紹介する方法に 代わる有効な手段よ
注意
静止しているJVMで同一クラスインスタンスを大量生成する方法だから
特定のオブジェクトのサイズを知りたい場合や
そのオブジェクトが実際にどれくらいのサイズかを測りたい場合は 他当たって。


【Q】オブジェクトのサイズって何よ?
【A】オブジェクトグラフやらオブジェクトのサイズやらは哲学的観点
  それらグラフデータが示すサイズゆうのは 知りたいオブジェクトインスタンスそのものサイズとちゃうのだ
  ビギナー向けにざっくり言うなら オブジェクトのサイズとは
  -オブジェクトに定義されたstaticでない全フィールドの合計サイズ(親クラスのフィールドも含む)
  -クラスメソッドは オブジェクトのサイズに影響しない(コレ、C++と違う点。)
  -インタフェースもオブジェクトサイズに影響なし(※)
  -結局 オブジェクト生成時状態である 全オブジェクトを終了させた時のサイズ
  ※インタフェースの実装は 単にそのクラスにマークを付けるだけで
   クラス定義にデータを追加するものでない
   実際にJVMも
   実装クラスの全メソッドがインタフェースに定義されてるかどうかのチェックをするだけ
   (最近コンパイラ仕様で厳しくなったとか)

【*】本題
  プリミティブ型を検証に使用↓な感じ
  (一般的な32-bit JVMなら java.lang.Objectで8バイト 基本データ(boolean以外)で定義分のメモリを要する)
  // java.lang.Object shell size in bytes:
  public static final int OBJECT_SHELL_SIZE = 8;
  public static final int OBJREF_SIZE = 4;
  public static final int LONG_FIELD_SIZE = 8;
  public static final int INT_FIELD_SIZE = 4;
  public static final int SHORT_FIELD_SIZE = 2;
  public static final int CHAR_FIELD_SIZE = 2;
  public static final int BYTE_FIELD_SIZE = 1;
  public static final int BOOLEAN_FIELD_SIZE = 1;
  public static final int DOUBLE_FIELD_SIZE = 8;
  public static final int FLOAT_FIELD_SIZE = 4;
  
  便宜上 オブジェクトインスタンスのサイズ以外に
  IObjectProfileNodesでデータ構造も出すっぺ

  interface IObjectProfileNode {
   Object object ();
   String name ();
  
   int size ();
   int refcount ();
  
   IObjectProfileNode parent ();
   IObjectProfileNode [] children ();
   IObjectProfileNode shell ();
  
   IObjectProfileNode [] path ();
   IObjectProfileNode root ();
   int pathlength ();
  
   boolean traverse (INodeFilter filter, INodeVisitor visitor);
   String dump ();
  } // End of interface

 

XXX



なんかUtilToolぽい
試しとらんが使えそう
http://sourceforge.net/projects/sizeof

ref:
Vladimir Roubtsov, Sizeof for Java, JavaWorld, 12/26/03
http://www.javaworld.com/javaworld/javaqa/2003-12/02-qa-1226-sizeof.html

tag : DL sizeof java

2009-02-09 06:58 : __lang__java : コメント : 0 : トラックバック : 0 :
コメントの投稿
非公開コメント

« next  ホーム  prev »

search

ad



counter


tag cloud

category cloud