WebSphereべからず集

第5回 「System#gc()を実行している」

Comments

コンテンツシリーズ

このコンテンツは全#シリーズのパート#です: WebSphereべからず集

このシリーズの続きに乞うご期待。

このコンテンツはシリーズの一部分です:WebSphereべからず集

このシリーズの続きに乞うご期待。

Category: Javaプログラミング一般
WAS Version:全て

Bad Practice

あるWebアプリケーションのプログラムでは、リクエストが行われるごとにSystem#gc()が実行されるようなつくりになっていました。

Result

このWebアプリケーションは、パフォーマンスに深刻なトラブルを抱えることになりました。システムの性能から推測される処理能力の1/100の処理もこなすことができませんでした。

Best Practice

アプリケーション中では、特別な理由がない限り、決してSystem.gc()を実行しないでください。
通常の状況では、System.gc()を使用した明示的なGCを実行しなくても、自動的に行われるGCだけでも全く問題はありません。
また、System.gc()を追加しても、パフォーマンスが向上することはほとんどありません。

Javaのヒープメモリ中に作成された一時オブジェクトは、GC(ガーベイジコレクション)によってメモリから開放されます。
このGCが起こるのは以下の三つの場合です。

  1. ヒープメモリ中に新規オブジェクトを作成するために必要な空き領域が足りなくなったとき(AF:Allocation FailureによるGC)
  2. プログラム中でSystem.gc()が実行されたとき
  3. JVMで実行する処理がなくなってアイドル状態になったとき(Async GC)

このうち、3.のGCはWASでは起こりません。
WAS内部では、サーブレットやEJBを実行していないときでもバックグランドで多くの処理が動いているためです。

2.と1.のGCにおいて、開放されるメモリの種類に違いはありません。
つまり、System.gc()を繰り返したからといって、別段効率的にメモリが開放されるわけではなく、使用可能なメモリが増えるわけではありません。
それどころか、System.gc()を繰り返すことにより、パフォーマンスに深刻なトラブルが発生することになります。

WAS 3.5で使われているJDK 1.2.x、WAS 4.0/5.0でつかわれているJDK 1.3.xでは、GCの発生している間は全てのスレッドが停止します。
よって、パフォーマンスを向上させるためには、GCの発生回数をなるべく押さえ、また一回あたりのGCの使用時間をなるべく短くする必要があります。

GCにかかる時間は様々な要因によって変化しますが、ヒープサイズと現在使用中のオブジェクトの量が大きく影響します。逆に開放される一時オブジェクト(=使用されていないオブジェクト)の量にはあまり影響されません。
よって、AFによるGCでもSystem.gc()によるGCでも、GC一回あたりの実行時間はそれほど変わりません。

System.gc()をアプリケーション中で連発しても、一回あたりのGCの時間はほとんど縮まらず、GCの回数だけが増えるだけです。パフォーマンスはSystem.gc()の実行回数が多くなるにしたがい、確実に悪くなります。
System.gc()を実行するメリットはありません。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=WebSphere
ArticleID=324981
ArticleTitle=WebSphereべからず集: 第5回 「System#gc()を実行している」
publish-date=10112003