オブジェクトに割り当てるサイズは非常に重要です。サイズが大きすぎるとメモリーの浪費につながり、小さすぎるとパフォーマンスの低下につながります。CodeCoachでは、オブジェクトに割り当てられているメモリーの最大値および最小値が表示されるだけでなく、使用されているメモリーの平均サイズ、オブジェクトのサイズが変更された回数、およびインスタンスの数も表示されます。
サイズ変更は非常にコストがかかる操作であるため、できるだけ回避する必要があります。ただし、メモリー消費量を減らすためにサイズ変更にかかるコストを受け入れる場合もあります。たとえば、データをバッファするオブジェクトの初期サイズが小さすぎる場合は、不必要なサイズ変更回数が発生するため、パフォーマンスに大きな影響を与えることになります。
メモリー割当てでは、その他のいずれのアドバイス・カテゴリよりも判断が必要となります。返される数値を常に確認し、サイズ変更回数が増えることと、確保しておく潜在的な未使用メモリーが増えることとの間でバランスを取る最良の方法を決定する必要があります。このため、CodeCoachは推奨サイズを返すのではなく、十分な情報を得た上で判断できるように適切なデータを提供します。
ArrayList al = new ArrayList(256);
このコードによって、ArrayListオブジェクトal
は256文字でインスタンス化されます。デフォルトは10です。
ArrayListインスタンスの使用方法アドバイスのキーワードは、NALS
です。
BitSet bset = new BitSet(128);
このコードによって、BitSetオブジェクトbset
は128文字でインスタンス化されます。デフォルトは64です。
ArrayListインスタンスの使用方法アドバイスのキーワードは、NBST
です。
HashMap hm = new HashMap(64);
このコードによって、HashMapオブジェクトhm
は64文字でインスタンス化されます。デフォルトは101です。
HashMapインスタンスの使用方法アドバイスのキーワードは、NHMP
です。
CodeCoachでは、Hashtable割当てを含む行ごとに、これらのHashtableへの追加に関する調査が実行されます。
HashtableがまだいっぱいでないことがCodeCoachによって検出されると、割当て時にサイズを減らすようにアドバイスされます。
Hashtableの初期サイズを設定するコンストラクタは、次のとおりです。
Hashtable ht = new HashTable(64);
このコードによって、Hashtableオブジェクトht
は64文字でインスタンス化されます。デフォルトは101です。
Hashtableインスタンスの使用方法アドバイスのキーワードは、NHTB
です。
new StringBuffer()
を使用してStringBufferが作成されると、初期メモリー割当ては16文字になります。初期サイズの16文字を超えて文字を追加する場合は、StringBufferには、より多くのメモリーが割り当てられます。
StringBufferを拡張するためにメモリーを割り当てる方法はコストがかかる場合があります。StringBufferの現在のサイズを超えて拡張する必要がある場合、サイズは2倍になり、古い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);
このコードによって、StringBufferオブジェクトsb
は1100文字でインスタンス化されます。デフォルトは16です。
StringBufferの大きさを把握することは困難です。領域を割り当てすぎることは、十分な領域を割り当てていないことと同様に問題となります。CodeCoachを使用すると、StringBufferの割当てが簡単になります。CodeCoachでは、StringBuffer割当てを含む行ごとに、StringBufferへの追加に関する調査が実行されます。
Javaコンパイラは文字列オブジェクトを連結するためのメカニズムとしてStringBufferを内部で使用するため、CodeCoachではこのような連結に関するアドバイスも提供されます。このような場合は、文字列をStringBufferに変更できます。これにより、操作をより効率的に制御できます。
StringBufferインスタンスの使用方法アドバイスのキーワードは、NSBU
です。
Vector v = new Vector(512);
このコードによって、Vectorオブジェクトv
は512文字でインスタンス化されます。デフォルトは10です。
Vectorインスタンスの使用方法アドバイスのキーワードは、NVCT
です。
WeakHashMap whm = new WeakHashMap(64);
このコードによって、WeakHashMapオブジェクトwhm
は64文字でインスタンス化されます。デフォルトは101です。
WeakHashMapインスタンスの使用方法アドバイスのキーワードは、NWHT
です。
Copyright © 1997, 2007, Oracle. All rights reserved.