CodeCoachでは、オブジェクトのサイズの初期値を指定可能にするコンストラクタを提供するすべてのユーティリティ・クラスに関して、メモリー・アドバイスを提供します。メモリーの割当てでは、このようなユーティリティ・クラスの次の2つの機能が重要になります。
これらの機能は、どちらも非常に便利ですが、サイズの初期値が適切に設定されていない場合、コードによってメモリーが浪費されてしまうことがあります。CodeCoachでは、メモリー使用量が大きすぎる場合と小さすぎる場合の2つの最も一般的な問題に関してアドバイスします。
メモリー用に確保されたスペースで使用される割合がわずかな場合、残りのスペースは無駄に割り当てられていることになります。たとえば、HashTableに対してデフォルトのコンストラクタを使用する場合、101のエントリを取得できます。一方、設計時にこのHashTableに5項目のみの保存を計画した場合、多くのスペースが無駄になります。このHashTableのサイズの初期値を10にして作成すると、設計に対して十分なパフォーマンスが保証され、また、割当てメモリーが減少し、無駄になっていたスペースが使用されるようになります。
一方、オブジェクトの元のサイズが小さすぎる場合、必要に応じて自動的に拡張されます。これらすべてのクラスに対して、メモリーおよび実行時間の両方の面から見て、拡張はコストがかかる操作です。次の場合について考えてみます。Vectorに対してデフォルトのコンストラクタを使用する場合、デフォルトの取得サイズは10になります。このとき、このVectorにオブジェクトを100追加すると、次のような一連の拡張が実行されます。
各拡張には、新しい配列の割当ておよび新しく割り当てられた配列への古い配列のコピーが含まれます。どちらの操作もコストがかかります。
さらに、この4つの拡張では、ガベージ・コレクションを行う必要がある4つの配列(サイズが10、20、40、80)が残ります。また、この処理がすべて完了した後、このような段階的な拡張によって到達した最終的なサイズが、必ずしもコンテンツに適しているわけではありません。この例では、最適なサイズの160%を使用しており、小さすぎる割当てから大きすぎる割当てになってしまいました。
各メモリー・アドバイスでは、問題になっている場所に割り当てられているオブジェクトに関して、次のような統計が提供されます。
サイズ、コンテンツおよび拡張に対して、CodeCoachでは最小値、平均値、最大値が提供されます。これらの値の解析は、通常簡単です。
たとえば、前述のHashTableの例では、次のような値が示されます。
一方、Vectorの例では、次のような値が示されます。
これらの2つの例は、非常に単純です。他の状況では、与えられた値の解析が難しい場合もあります。たとえば、1000のVectorを割り当て、そのうちの999は100個の値で埋めていますが、最後の1つは使用しません。返される統計は、次のようになります。
平均のコンテンツ(99)の値を利用することにした場合、この例では、結果は適切ではありません。全体のサイズの198に対して、(100番目の要素を追加するために)999のVectorを1回拡張し、空の1つのうちの99の位置を失います。
CodeCoachから重要な統計を取得する場合、状況を判断するための最善の方法は、アプリケーションが実際にオブジェクトを使用して何を行っているのかという最初の原則に戻ることです。たとえば、プログラムの経験則に従って、適切な初期サイズを予測する方法がわかっている場合は、この方法によって計算したサイズをオブジェクトの作成時に使用します。
基本的なガイドラインの一部を示します。
これらの基本的なガイドラインは、Vector、StringBufferなどに当てはまります。HashTablesの場合、ハッシュの衝突の数を抑えるために数を大きくする場合があります。
CodeCoachでは、返されたメモリー改善アドバイスに従うと、最初に簡単な問題を処理している間、細心の注意が必要なより複雑な問題が強調表示されます。このような複雑な問題については、状況に応じて最適な値を選択する上で開発者の知識が不可欠です。
Copyright © 1997, 2007, Oracle. All rights reserved.