2011-11-12 11 views
2

可能性の重複:ActionScriptで
In Java, what is the best way to determine the size of an object?Java:オブジェクトのメモリサイズを調べますか?

私は通常ちょうど行うことができます。

var myVar:uint = 5; 
getSize(myVar) 
//outputs 4 bytes 

私はJavaでこれをどのように行うのですか?

+0

おかげで、私は尋ねる前にそれを見ましたが、Javaには独自の方法があると考えました。私はクイッククエリのためのまったく新しいクラスを作成するような気がしません – tetris11

答えて

3

あなたが前と後)(Runtime.freeMemoryを確認することができます-XX:-UseTLABオフにした場合。しかし、ローカル変数の場合は、ヒープ上に(スタックを使用するときに)スペースを取らず、サイズを取得できません。

しかし、intは32ビットの符号値であり、あなたはそれが(JVMスタックアライメント等に応じ以上)4バイトを使用することを期待することができ

C++でsizeofがポインタのために有用です算術。 Javaではこれが許可されていないので、低レベルの詳細を気にする開発者を避けるため、有用ではなく、意図的に隠されている可能性があります。

+0

少し深くここに。例を教えてください。私は本当に-XXを消す方法を知らない:-UseTLAB? – tetris11

+0

これはコマンドラインオプションで、クラス名の前のコマンドラインに追加します。基本的に、オブジェクトのサイズはあなたが知る必要があるものではありません。面白いかもしれませんが、問題があることを知らない限り、心配しないことをお勧めします。どのような原因で私はプロファイラを使用し、それはあなたに実際のサイズを与えるでしょう。 –

+0

@PeterLawrey - これを行うためのより良い方法については、リンクされた質問を参照してください。 –

1

私はこれを行う直接的な方法はないと信じています。 @Peter Lawreyの提案は近いと思われる。しかし、他のスレッドからもバックグラウンドで多くの他の割り当てがある可能性があるので、Objectビルドの前後で利用可能な空きメモリの差を取ることによってオブジェクトサイズを計算することに頼ることはできません。また、ガベージコレクタが起動し、操作の間にメモリを解放する可能性があります。また、特に、マルチスレッド環境では、メモリの違いに頼ることは間違いなく解決策ではありません。彼らは、手動メモリ管理や、いくつかのポインタ演算のもののためにそれを必要とするので

1

CがSIZEOF本来の持っていた唯一の理由(機能?ほかに何か)でした。

Javaではその必要はありません。また、オブジェクトがどれくらいのメモリを占有しているかは完全に定義されており、信頼性をもって回答することはできませんが、同じオブジェクトのロットを割り当てていくつかの統計を試すことができます。 。

私たちは私たちのVMに関するいくつかの基本を知っている場合はホットスポットのためのように、我々はまた、単に、メモリを数えることができます:オーバーヘッドオブジェクトごとの単語

  • すべてのオブジェクトは、8バイトが揃っているが(つまりあなたに切り上げる必要があり

    • 2 8の倍数)の変数のための
    • 少なくとも1ワードが、つまりあなたが任意の変数のないオブジェクトを持っている場合でも、我々はトンので、お使いの言語仕様ビットを知っている必要があります。また

    1つの単語、「無駄」なぜなら、内部クラスには、明らかなものよりも1つの追加参照があり、静的内部クラスはなぜそうでないのか理解しています。

    少しの作業がありますが、一般的には無駄なことを知っています。メモリが心配ならば、ActionScriptでもJavaでもC/C++ではないはずです。 Javaを使用していますが、通常は2倍のメモリを使用しています。

  • 関連する問題