[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[jfriends-ml 13043] Re: 「 Effective Java (第 2 版)」を読む会第 7 回議事録 - new byte[0]
高橋(智)です。
> 【宿題】new byte[0]とnew Object()とどちらが省メモリ・高性能かを
> プロファイラを使って調べてみよう!
> → NetBeansには標準でプロファイラがついている。Eclipseは?
この話題の元となった「Javaの鉄則」を再度読んでみました。
ロックに関して、だいたいこんなことが書かれています。
・オブジェクトの生成にはコストがかかる
・byte[] lock = new byte[0]; は以下のバイトコードを生成する
・Object lock = new Object(); は以下のバイトコードを生成する
・サイズ0のbyte配列を生成すれば、Objectのようなコンストラクタを呼び出す必要が無い
・配列のほうが高速に実行される
ということで、サイズというよりは、lockオブジェクトの生成の部分のみに言及しています。
ためしに、javap -c で逆アセンブルすると、
new byte[0] は
----------------------
iconst_0
newarray byte
----------------------
となり、
new Object() は
----------------------
new #35; //class java/lang/Object
dup
invokespecial #36; //Method java/lang/Object."<init>":()V
----------------------
となりました。
実際にメモリプロファイラ(OptimizeIt)で、new byte[0]とnew Object()のサイズを確認すると、
どちらも16byteになっていました。(Windowsで、JDK1.5, 32bit版を使用)
--
高橋智宏
Java読書会( http://www.javareading.com/bof/ )