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

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

サイズ変更は非常に負荷のかかる操作であるため、できるだけ避ける必要があります。しかし、メモリー使用量を減らすためにサイズ変更を行った方がよい場合もあります。たとえば、データをバッファリングするオブジェクトの初期サイズが小さすぎると、不必要なサイズ変更が行われ、パフォーマンスに著しく影響します。

他のアドバイス・カテゴリと比べて、メモリー割当てでは判断が必要です。常に返される数字を調べて、サイズ変更の回数と潜在的に未使用のまま残されるメモリー量のバランスをとるための最適な戦略を決定する必要があります。CodeCoachから推奨サイズではなく、最適な決断を下すための関連データが返されるのもこのためです。

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

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

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

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

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

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

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

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

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

Hashtableインスタンスの使用方法
HashTableオブジェクトは、StringBufferオブジェクトと同様、サイズを変更できます。しかし、HashTableのサイズを変更すると、そのたびに表全体もサイズを変更する必要があるため、さらに負荷がかかります。その上、HashTableのデフォルト・サイズは101であるため、必要以上に大きくなりがちです。

CodeCoachでは、HashTable割当てを含む各行について、これらのHashTableに何が追加されるかを調査します。

CodeCoachによってHashTableが十分使用されていないことが検出された場合、割当て時のサイズ縮小を薦めるアドバイスが返されます。

HashTableの初期サイズを設定するコンストラクタを次に示します。

Hashtable ht = new HashTable(64);

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

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

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

StringBufferを拡張するためにメモリーを割り当てる方法は、コストがかかる可能性があります。StringBufferを現在のサイズ以上に拡張する必要のある場合、サイズは倍増され、古い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);

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

StringBufferがどのくらい大きくなるかを追跡することは困難な場合もあり、割当て領域が多すぎることは、足りないことと同様に問題です。CodeCoachにより、StringBuffer割当てが容易になります。CodeCoachでは、StringBuffer割当てを含む各行について、これらのStringBufferに何が追加されるかを調査します。

内部的にJavaコンパイラではStringBufferがStringオブジェクトを連結するメカニズムとして使用されるため、CodeCoachが、そのような連結に関するアドバイスを提供することもあります。そのような場合、かわりにStringをStringBufferに変更してもかまいません。これにより、操作が制御しやすくなります。

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

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

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

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

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

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

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


プロジェクトのCodeCoach処理
CodeCoachアドバイス・タイプを使用可または使用不可に設定
CodeCoachアドバイス・レベルの設定
コマンドラインからのCodeCoachの使用
「プロジェクトの設定」ダイアログ - 「CodeCoach」ページ

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