プログラミング
基本方針
- Simpler is better…複雑なコーディングがよい結果をもたらさないことが多い
- 問題を早期に発見し,改良をおこなうことを推奨する.
- 運用開始前: 負荷テストをおこなう
- ボトルネックの発見
- 性能の推定…システム投資の予測
- 運用中: 使用状況を監視する
- 予想外の使用方法によるバグの顕在化
- タイミング依存のバグの発見
- 不法アクセスの発見
GCを意識したコーディング
- 一部Conservative GCであるClassic VMでは,スタックから指されているオブジェクトは回収されない
- スタックが再び上書きされるまで遅延される.
- 対策: 使用した後にnullを代入して,スタックからの参照をクリアする.
- Exact GCであるJava VMの場合は不要である.
- コーディング時にfinalize()をできる限り使用しない
- finilize()を定義するとGCが遅くなる
- Java 2 SDK 1.2以降では仕様が変更され,必ずしも思った通りのタイミングで呼ばれるとは限らない
- 世代別コピー式GCでは,オブジェクトの使い捨てはあまり気にする必要はない.
- オブジェクト再利用は,コーディングを複雑化する.
- 問題が出てから考える.
- Java 2以降では,キャッシュの実装などにReferenceObjectを使用し,ヒープを有効活用することを心掛ける.
スレッドを意識したコーディング
- 基本的にServlet内部でスレッドを生成しない
- Servletはシングルスレッドとして実装しても,マルチスレッドで実行される.
- Servletを実行するスレッド間の並行性を高めることを意識する.
- プログラム内部で生成したスレッドは,Servletコンテナのスレッドマネージャの管理下にないので,管理を複雑化する.
- synchronized宣言を多用しない.
- SingleThreadModelをしっかり理解する.