CodeCoachメモリー改善アドバイス

オブジェクトに割り当てるサイズは非常に重要です。サイズが大きすぎるとメモリーの浪費につながり、小さすぎるとパフォーマンスの低下につながります。CodeCoachでは、オブジェクトに割り当てられているメモリーの最大値および最小値が表示されるだけでなく、使用されているメモリーの平均サイズ、オブジェクトのサイズが変更された回数、およびインスタンスの数も表示されます。

サイズ変更は非常にコストがかかる操作であるため、できるだけ回避する必要があります。ただし、メモリー消費量を減らすためにサイズ変更にかかるコストを受け入れる場合もあります。たとえば、データをバッファするオブジェクトの初期サイズが小さすぎる場合は、不必要なサイズ変更回数が発生するため、パフォーマンスに大きな影響を与えることになります。

メモリー割当てでは、その他のいずれのアドバイス・カテゴリよりも判断が必要となります。返される数値を常に確認し、サイズ変更回数が増えることと、確保しておく潜在的な未使用メモリーが増えることとの間でバランスを取る最良の方法を決定する必要があります。このため、CodeCoachは推奨サイズを返すのではなく、十分な情報を得た上で判断できるように適切なデータを提供します。

ArrayListインスタンスの使用方法
ArrayListオブジェクトはVectorオブジェクトと同様に動作し、同じアドバイスが適用されます。ArrayListの初期サイズを設定するコンストラクタは、次のとおりです。
ArrayList al = new ArrayList(256);         

このコードによって、ArrayListオブジェクトalは256文字でインスタンス化されます。デフォルトは10です。

ArrayListインスタンスの使用方法アドバイスのキーワードは、NALSです。

BitSetインスタンスの使用方法
BitSetオブジェクトは、101ではなく64のグループに割り当てられている点を除いて、Vectorオブジェクトと同様に動作します。それ以外の点では、同じアドバイスが適用されます。BitSetの初期サイズを設定するコンストラクタは、次のとおりです。
BitSet bset = new BitSet(128);         

このコードによって、BitSetオブジェクトbsetは128文字でインスタンス化されます。デフォルトは64です。

ArrayListインスタンスの使用方法アドバイスのキーワードは、NBSTです。

HashMapインスタンスの使用方法
HashMapオブジェクトはHashtableオブジェクトと同様に動作し、同じアドバイスが適用されます。HashMapの初期サイズを設定するコンストラクタは、次のとおりです。
HashMap hm = new HashMap(64);         

このコードによって、HashMapオブジェクトhmは64文字でインスタンス化されます。デフォルトは101です。

HashMapインスタンスの使用方法アドバイスのキーワードは、NHMPです。

Hashtableインスタンスの使用方法
HashtableオブジェクトはStringBufferオブジェクトに類似しており、サイズを変更できます。ただし、Hashtableのサイズ変更では、サイズを変更するたびにテーブル全体を再ハッシュする必要があるため、よりコストがかかります。また、Hashtableのデフォルト・サイズは101であり、通常必要とされるサイズよりも大きくなっています。

CodeCoachでは、Hashtable割当てを含む行ごとに、これらのHashtableへの追加に関する調査が実行されます。

HashtableがまだいっぱいでないことがCodeCoachによって検出されると、割当て時にサイズを減らすようにアドバイスされます。

Hashtableの初期サイズを設定するコンストラクタは、次のとおりです。

Hashtable ht = new HashTable(64);        

このコードによって、Hashtableオブジェクトhtは64文字でインスタンス化されます。デフォルトは101です。

Hashtableインスタンスの使用方法アドバイスのキーワードは、NHTBです。

StringBufferインスタンスの使用方法
new StringBuffer()を使用してStringBufferが作成されると、初期メモリー割当ては16文字になります。初期サイズの16文字を超えて文字を追加する場合は、StringBufferには、より多くのメモリーが割り当てられます。

StringBufferを拡張するためにメモリーを割り当てる方法はコストがかかる場合があります。StringBufferの現在のサイズを超えて拡張する必要がある場合、サイズは2倍になり、古いStringBufferは新しく割り当てられた領域にコピーされます。したがって、前述の例を使用すると、メモリー割当ては次のようになります。

コマンド 必要なメモリー 割当て済メモリー

new StringBuffer()

0文字

16文字

append("0123456789")

10文字

16文字

append("0123456789")

20文字

32文字

このメモリー割当ては不適切ではありませんが、文字列を追加するループにこのメモリー割当てを複数回配置すると、次のようになります。


class foo { void dostringop() { int i; StringBuffer sb; sb = new StringBuffer(); for (i=0; i<100; i++) { sb.append("01234567890"); } } }

ここで、必要なメモリーと割当て済メモリーを追跡すると、次のようになります。

コマンド 必要なメモリー 割当て済メモリー

new StringBuffer()

0文字

16文字

append("0123456789")

10文字

16文字

append("0123456789")

20文字

32文字

append("0123456789")

30文字

32文字

append("0123456789")

40文字

64文字

append("0123456789")

50文字

64文字

append("0123456789")

60文字

64文字

append("0123456789")

70文字

128文字

...

...

...

append("0123456789")

1100文字

2048文字

深刻な問題が発生する可能性があります。この場合、ほとんど1Kのメモリーが浪費されています。また、StringBufferのサイズ変更を7回行うことは、パフォーマンス上の問題を引き起こす可能性があります。

このような問題を回避するために、StringBufferには、バッファに領域を手動で割り当てることが可能なコンストラクタがあります。

StringBuffer sb = new StringBuffer(1100);        

このコードによって、StringBufferオブジェクトsbは1100文字でインスタンス化されます。デフォルトは16です。

StringBufferの大きさを把握することは困難です。領域を割り当てすぎることは、十分な領域を割り当てていないことと同様に問題となります。CodeCoachを使用すると、StringBufferの割当てが簡単になります。CodeCoachでは、StringBuffer割当てを含む行ごとに、StringBufferへの追加に関する調査が実行されます。

Javaコンパイラは文字列オブジェクトを連結するためのメカニズムとしてStringBufferを内部で使用するため、CodeCoachではこのような連結に関するアドバイスも提供されます。このような場合は、文字列をStringBufferに変更できます。これにより、操作をより効率的に制御できます。

StringBufferインスタンスの使用方法アドバイスのキーワードは、NSBUです。

Vectorインスタンスの使用方法
StringBufferオブジェクトと同様、Vectorオブジェクトは自動的に拡張されることがあります。CodeCoachでは、StringBufferをチェックする場合と同じ方法論を使用して、Vectorを効率的に使用しているかどうかがチェックされます。Vectorの初期サイズを設定するコンストラクタは、次のとおりです。
Vector v = new Vector(512);         

このコードによって、Vectorオブジェクトvは512文字でインスタンス化されます。デフォルトは10です。

Vectorインスタンスの使用方法アドバイスのキーワードは、NVCTです。

WeakHashMapインスタンスの使用方法
WeakHashMapオブジェクトはHashtableオブジェクトと同様に動作し、同じアドバイスが適用されます。WeakHashMapの初期サイズを設定するコンストラクタは、次のとおりです。
WeakHashMap whm = new WeakHashMap(64);         

このコードによって、WeakHashMapオブジェクトwhmは64文字でインスタンス化されます。デフォルトは101です。

WeakHashMapインスタンスの使用方法アドバイスのキーワードは、NWHTです。


CodeCoachを使用したコード品質の改善
CodeCoachアドバイス・タイプを使用可または使用不可に設定
CodeCoachアドバイス・レベルの設定
コマンドラインからのCodeCoachの使用

CodeCoachメモリー改善アドバイスについて