豆知識 - (2005/11/02 (水) 13:07:01) の1つ前との変更点
追加された行は緑色になります。
削除された行は赤色になります。
*JAVA豆知識
**パフォーマンスにおける留意点
1.文字列の連結を行う場合は、StringBufferクラスを用いる
必要な文字列のサイズがわかる場合は、StringBufferクラスの
生成時にあらかじめ十分な容量を確保するようにする
//Stringクラスによる文字連結
String str_x = "x";
String str_y = "y"
String str = str_x + str_y;
【内部処理】
String str =
(new StringBuffer()).append(str_x).append(str_y).toString();
1.StringBufferクラスの生成
2.Stringクラスの生成(toString()メソッドによる)
3.Stringクラス、StringBufferクラスが内部で保持しているchar型配列の生成
無駄な内部処理を避ける為、StringBufferクラスを用いる
//StringBufferクラスによる文字連結
StringBuffer sb = new StringBuffer();
sb.append(str_x);
sb.append(str_y);
String str = sb.toString();
2.無駄なオブジェクトの生成を減らす
・冗長な初期化は行わないようにする
・必要なオブジェクトは必要な時点で初期化する
・ソースコードの途中で不要となった生成済みのオブジェクトは明示的に解放する
・繰り返し利用できたり、ほかの部分で利用可能な生成済みのオブジェクトは再利用する
【詳細】
○Garbage Collector
java言語ではオブジェクトを一度生成したとき、その後使用されなくなったオブジェクトはGarbage Collector(GC)によって自動的に回収される。プログラム上であまり長い間使用しないオブジェクトを多数生成してしまった場合、GCが頻繁に動くために余計なコストが掛かってしまい、パフォーマンスに影響を与えてしまう。
①オブジェクトの初期化を繰り返し行わない
public class TestOfNew {
private final String TEST = new String();
public TestOfNew() {
TEST = new String();
}
}
当然ながら初期化の分の処理コストが増えるため、パフォーマンスが低下。
②オブジェクトの初期化は必要な時点で行う
TestObj obj = new TestObj();
if(hensu == 1){
obj.setXXX("XXX");
処理・・・
} else {
}
先頭部分で初期化したオブジェクトがその後のif分岐等により
使用されないまま処理が終了してしまうケース。
・オブジェクトを生成すると処理コストが余計にかかる
・初期化したオブジェクトの容量によっては、サーバのメモリを圧迫してしまい、パフォーマンスの低下を招く
・一定期間使用されないと、GCがオブジェクトを破棄してメモリを解放するため、さらに余計なコストが掛かる
⇒オブジェクトの初期化は実際に必要となる時点で行う。
*JAVA豆知識
**パフォーマンスにおける留意点
1.文字列の連結を行う場合は、StringBufferクラスを用いる
必要な文字列のサイズがわかる場合は、StringBufferクラスの
生成時にあらかじめ十分な容量を確保するようにする
//Stringクラスによる文字連結
String str_x = "x";
String str_y = "y"
String str = str_x + str_y;
【内部処理】
String str =
(new StringBuffer()).append(str_x).append(str_y).toString();
1.StringBufferクラスの生成
2.Stringクラスの生成(toString()メソッドによる)
3.Stringクラス、StringBufferクラスが内部で保持しているchar型配列の生成
無駄な内部処理を避ける為、StringBufferクラスを用いる
//StringBufferクラスによる文字連結
StringBuffer sb = new StringBuffer();
sb.append(str_x);
sb.append(str_y);
String str = sb.toString();
2.無駄なオブジェクトの生成を減らす
・冗長な初期化は行わないようにする
・必要なオブジェクトは必要な時点で初期化する
・ソースコードの途中で不要となった生成済みのオブジェクトは明示的に解放する
・繰り返し利用できたり、ほかの部分で利用可能な生成済みのオブジェクトは再利用する
【詳細】
○Garbage Collector
java言語ではオブジェクトを一度生成したとき、その後使用されなくなったオブジェクトはGarbage Collector(GC)によって自動的に回収される。プログラム上であまり長い間使用しないオブジェクトを多数生成してしまった場合、GCが頻繁に動くために余計なコストが掛かってしまい、パフォーマンスに影響を与えてしまう。
①オブジェクトの初期化を繰り返し行わない
public class TestOfNew {
private final String TEST = new String();
public TestOfNew() {
TEST = new String();
}
}
当然ながら初期化の分の処理コストが増えるため、パフォーマンスが低下。
②オブジェクトの初期化は必要な時点で行う
TestObj obj = new TestObj();
if(hensu == 1){
obj.setXXX("XXX");
処理・・・
} else {
}
先頭部分で初期化したオブジェクトがその後のif分岐等により
使用されないまま処理が終了してしまうケース。
・オブジェクトを生成すると処理コストが余計にかかる
・初期化したオブジェクトの容量によっては、サーバのメモリを圧迫してしまい、パフォーマンスの低下を招く
・一定期間使用されないと、GCがオブジェクトを破棄してメモリを解放するため、さらに余計なコストが掛かる
⇒オブジェクトの初期化は実際に必要となる時点で行う。
3.不要になった生成済みのオブジェクトは明示的にnullを代入して解放
オブジェクトを生成すれば、その分のメモリは消費されて
サーバのメモリが圧迫される。そこで途中で必要がなくなった
オブジェクトはできるだけすぐにGCによって回収してメモリを
解放したほうがメモリ使用量を抑制することができる。
そのため、開発者がプログラムロジック上で不要になった
オブジェクトに対して明示的にnullを代入することによって、
GCが各オブジェクトがプログラム上で不要になったかどうかを
判断する際の有効な材料となる。
プログラム上で多数のオブジェクトを生成しているために
Webアプリケーションサーバのメモリを圧迫しているシステムに
対してはパフォーマンス上の効果があると思われる。
表示オプション
横に並べて表示:
変化行の前後のみ表示: