Javaアプリを少しでも高速化するスレ
■ このスレッドは過去ログ倉庫に格納されています
0048デフォルトの名無しさん
2005/10/11(火) 13:05:21ガベージコレクタの動作を助けたつもりでもJavaのプログラムでは、メモリの確保と解放が一度に実行
されるとパフォーマンスが極度に低下します。
そのため、オブジェクトプーリングや null代入といった多くの巧妙な技術が考案されました。しかしながら、
多くの場合において、こういった手法はパフォーマンスを向上させるどころか、むしろ低下させる結果を招い
てしまいました。
http://www-6.ibm.com/jp/developerworks/java/040312/j_j-jtp01274.html
明示的null代入
明示的null代入は、単に使い終わった参照オブジェクトにnullを代入するというものです。この手法は
オブジェクトをよく早くガベージコレクションの対象にするという考え方から生まれました。少なくとも
理論上はそれが正しいとされています。
明示的null代入が、有効であるというだけでなく事実上必要とされる場合 もあります。それはオブジェク
トへの参照が、実際に使われる範囲よりも広いスコープで要求されている場合や、プログラムの仕様上
それが妥当だと考えられている場合です。ローカル変数を使わず、一時的なバッファにオブジェクトの参
照を確保しておくためのスタティックもしくはインスタンスの領域を使う場合(参考文献からリンクしている
「Eye on performance: Referencing objects」での使用例をご参照ください)や、プログラムの必要性から
ではなく、実行時に常に参照される可能性があるという意味で、オブジェクトの参照を配列に保持しておく
場合などが、これに当てはまります。配列による単純な有限スタックの実装を示したリスト3のクラスをご
覧ください。仮に明示的 null代入を行なわずにpop()を呼んだ場合、このクラスはメモリリーク(正確には
「意図しないオブジェクト保持」と呼びます。また「オブジェクト浮遊」と呼ばれることもあります)を引き起
こす可能性があります。なぜなら、stack[top+1]に保持された参照は、既にプログラム上は必要とされな
くなっているのに、ガベージコレクタがまだこれを必要なものとみなしているからです。
リスト4. ファイナライザと明示的null代入の両用により全体のパフォーマンスが極度に低下する例(決してやらないでください)
■ このスレッドは過去ログ倉庫に格納されています