CodeCoachは、オブジェクトの初期サイズを指定できるコンストラクタを提供するすべてのユーティリティ・クラスに関するメモリー・アドバイスを提供します。このようなユーティリティ・クラスには、メモリー割当てにとって重要な機能が2つあります。
これらの機能は非常に有益ですが、初期サイズを適切に設定しないと、コードがメモリーを無駄に使用する原因になります。CodeCoachは、メモリーの使用に関連する2つの最も一般的な問題、大きすぎるサイズと小さすぎるサイズについてアドバイスします。
メモリー用に予約された領域のごく一部しか使用されない場合、残りの領域は無駄に割り当てられていることになります。たとえば、HashTableにデフォルトのコンストラクタを使用すると、101のエントリを持つHashTableが作成されます。設計によりこのHashTableに5つの項目しか格納されない場合、大量の領域が無駄になります。初期サイズが10のHashTableを作成すると、設計に十分なパフォーマンスが提供され、メモリー用の領域を減らして、残りの領域を他の用途に使用できます。
オブジェクトの元のサイズが小さすぎると、必要に応じて自動的に拡張されます。拡張操作はメモリーを消費し、実行時間もかかります。次の状況を考えてみます。Vectorにデフォルトのコンストラクタを使用すると、デフォルト・サイズは10になります。このVectorに100のオブジェクトを追加するとします。システムは、次の一連の拡張操作を実行します。
要素11を追加 => Vectorのサイズが10 -> 20へと2倍になる
要素21を追加 => Vectorのサイズが20 -> 40へと2倍になる
要素41を追加 => Vectorのサイズが40 -> 80へと2倍になる
要素81を追加 => Vectorのサイズが80 -> 160へと2倍になる
拡張ごとに新しい配列が割り当てられ、古い配列が新しく割り当てられた配列にコピーされます。どちらの操作もメモリーを消費し、時間がかかります。
さらに、4つの拡張により4つのガベージ配列(サイズ10、20、40、80)が残ります。これらの配列を収集する必要があります。また、最終的にこのようなステップごとの拡張で得られるサイズが内容に十分適しているとはかぎりません。この例では、最適サイズの160%を使用しています。つまり、メモリーの割当てが小さすぎたために、結果的にサイズが大きくなりすぎました。
各メモリー・アドバイスは、対象の位置に割り当てられたオブジェクトについて次の統計情報を提供します。
CodeCoachは、サイズ、内容および拡張について、最小値、平均値および最大値を示します。一般に、これらの値は非常に簡単に理解できます。
たとえば、HashTableの例では、次のように表示されます。
Size 101/101/101
Content 5/5/5
Exp 0/0.00/0
Vectorの例では、次のように表示されます。
Size 160/160/160
Content 100/100/100
Exp 4/4.00/4
この2つの例はかなり単純です。値の解釈に注意が必要な場合もあります。たとえば、1000個のVectorを割り当て、そのうち999個のVectorには100個の値を入れ、最後のVectorはまったく使用しないとします。この場合、次の統計情報が返されます。
Size 10/159/160
Content 0/99/100
Exp 0/3.99/4
平均の内容数(99)を採用する場合、良好な結果は得られません。(100個目の要素を追加するため)最終的に999個のVectorをサイズ198に拡張し、空のVectorの99個の場所は失われます。
CodeCoachから重要な統計を取得した後、アプリケーションが実際にオブジェクトに対して何を行うかという最初の原則に戻って状況を判断します。プログラムでの試行錯誤による発見から適切な初期サイズを予測する方法を見つけ、その後オブジェクトを作成する際に、この計算されたサイズを使用できます。
基本的なガイドラインは次のとおりです。
これらの基本的なガイドラインは、Vector、StringBufferなどに当てはまります。HashTableの場合は、ハッシュの衝突数を抑えるために、数値を上げる必要がある場合があります。
CodeCoachから返されるメモリー改善アドバイスを使用することにより、まず簡単な問題を解決して取り除き、注意が必要な複雑な問題に焦点を絞ることができます。複雑な問題の場合、状況に合った最適値の選択には、開発者の知識が最も重要です。
Copyright © 1997, 2004, Oracle. All rights reserved.