[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/ )