オブジェクトに割り当てるサイズは非常に重要です。 サイズが大きすぎるとメモリーが無駄に使用され、メモリーが小さすぎるとパフォーマンスが低下します。CodeCoachは、オブジェクトに割り当てられたメモリーの最大値と最小値のみでなく、使用メモリーの平均サイズ、オブジェクトのサイズが変更された回数およびインスタンス数を知らせます。
サイズ変更は非常に負荷のかかる操作であるため、できるだけ避ける必要があります。しかし、メモリー使用量を減らすためにサイズ変更を行った方がよい場合もあります。たとえば、データをバッファリングするオブジェクトの初期サイズが小さすぎると、不必要なサイズ変更が行われ、パフォーマンスに著しく影響します。
他のアドバイス・カテゴリと比べて、メモリー割当てでは判断が必要です。常に返される数字を調べて、サイズ変更の回数と潜在的に未使用のまま残されるメモリー量のバランスをとるための最適な戦略を決定する必要があります。CodeCoachから推奨サイズではなく、最適な決断を下すための関連データが返されるのもこのためです。
ArrayList al = new ArrayList(256);
このコードでは、256文字のArrayListオブジェクトal
がインスタンス化されます。デフォルトは10です。
ArrayListインスタンスの使用方法のアドバイスのキーワードはNALS
です。
BitSet bset = new BitSet(128);
このコードでは、128文字のBitSetオブジェクトbset
がインスタンス化されます。デフォルトは64です。
BitSetインスタンスの使用方法のアドバイスのキーワードはNBST
です。
HashMap hm = new HashMap(64);
このコードでは、64文字のHashMapオブジェクトhm
がインスタンス化されます。デフォルトは101です。
HashMapインスタンスの使用方法のアドバイスのキーワードはNHMP
です。
CodeCoachでは、HashTable割当てを含む各行について、これらのHashTableに何が追加されるかを調査します。
CodeCoachによってHashTableが十分使用されていないことが検出された場合、割当て時のサイズ縮小を薦めるアドバイスが返されます。
HashTableの初期サイズを設定するコンストラクタを次に示します。
Hashtable ht = new HashTable(64);
このコードでは、64文字のHashTableオブジェクトht
がインスタンス化されます。デフォルトは101です。
Hashtableインスタンスの使用方法のアドバイスのキーワードはNHTB
です。
new StringBuffer();
を介してStringBufferを作成した場合、その初期メモリー割当ては16文字です。初期の16文字サイズを超える文字を追加した場合、StringBufferにはさらに多くのメモリーが割り当てられます。
StringBufferを拡張するためにメモリーを割り当てる方法は、コストがかかる可能性があります。StringBufferを現在のサイズ以上に拡張する必要のある場合、サイズは倍増され、古いStringBufferが新規に割り当てられた領域にコピーされます。したがって、前述の例を使用した場合、メモリーの割当ては次のようになります。
コマンド | 必要なメモリー | 割当てメモリー |
---|---|---|
|
0文字 |
16文字 |
|
10文字 |
16文字 |
|
20文字 |
32文字 |
この場合は問題ありません。しかし、これを次のように、同じ文字列が何度も追加されるループに入れるとします。
class foo {
void dostringop() {
int i;
StringBuffer sb;
sb = new StringBuffer();
for (i=0; i<100; i++) {
sb.append("01234567890");
}
}
}
この場合の必要なメモリーおよび割当てメモリーを追跡します。これは次のようになります。
コマンド | 必要なメモリー | 割当てメモリー |
---|---|---|
|
0文字 |
16文字 |
|
10文字 |
16文字 |
|
20文字 |
32文字 |
|
30文字 |
32文字 |
|
40文字 |
64文字 |
|
50文字 |
64文字 |
|
60文字 |
64文字 |
|
70文字 |
128文字 |
... |
... |
... |
|
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 v = new Vector(512);
このコードでは、512文字のVectorオブジェクトv
がインスタンス化されます。デフォルトは10です。
Vectorインスタンスの使用方法のアドバイスのキーワードはNVCT
です。
WeakHashMap whm = new WeakHashMap(64);
このコードでは、64文字のWeakHashMapオブジェクトwhm
がインスタンス化されます。デフォルトは101です。
WeakHashMapインスタンスの使用方法のアドバイスのキーワードはNWHT
です。
Copyright © 1997, 2004, Oracle. All rights reserved.