Java Platform, Standard Edition HotSpot Virtual Machineガベージ・コレクション・チューニング・ガイド
目次      

1 紹介

Java Platform, Standard Edition (Java SE)は、デスクトップで使用される小さなアプレットから大規模なサーバーで運用されるWebサービスまで、様々なアプリケーションで使用されています。Java HotSpot仮想マシン実装(Java HotSpot VM)は、このように多様なデプロイメントに対応して、それぞれ異なる要件を満たすように設計された複数のガベージ・コレクタを備えています。これは、アプリケーションの規模にかかわらず、その要求を満たす上で重要な要素です。Java SEは、アプリケーションが動作するコンピュータの種類に基づいて、最適なガベージ・コレクタを選択します。ただし、すべてのアプリケーションに対して最適な選択になるとはかぎりません。厳しいパフォーマンス目標などの要件が課せられたユーザー、開発者および管理者は、必要なレベルのパフォーマンスを達成するため、場合によってはガベージ・コレクタを明示的に選択して、特定のパラメータを調整する必要があります。このドキュメントでは、これらのタスクに役立つ情報を提供します。最初に、stop-the-world型のシリアル・コレクタに関連する項で、ガベージ・コレクタの一般的な機能と基本的なチューニング・オプションについて説明します。次に、その他のコレクタ固有の機能について、コレクタの選択時に考慮すべき要因とともに紹介します。

ガベージ・コレクタ(GC)はメモリー管理ツールです。次の操作を通して、自動メモリー管理を実現します。

ガベージ・コレクタの選択は、どのような場合に問題になるのでしょうか。アプリケーションによっては、まったく問題になりません。つまり、ガベージ・コレクションによる一時停止が適度な頻度で適度な期間にわたって発生すれば、アプリケーションは問題なく実行できます。ただし、大規模なアプリケーション、特に大量のデータ(複数GB)を保持し、多数のスレッドを使用する、トランザクション率の高いアプリケーションでは、このようにはいきません。

アムダールの法則(特定の問題に対して並列化がもたらす速度の向上は、問題の逐次処理部分によって制限される)は、ワークロードのほとんどは完全には並列化できず、必ず逐次処理される部分があり、その部分は並列処理の恩恵を受けないことを示しています。これはJavaプラットフォームにも当てはまります。特にOracleが提供しているJava SE 1.4より前のJavaプラットフォーム向け仮想マシンでは、パラレル・ガベージ・コレクションをサポートしていないため、マルチプロセッサ・システムに対するガベージ・コレクションの影響が他の並列アプリケーションに比べて大きくなります。

図1-1「ガベージ・コレクションに要した時間の割合の比較」のグラフは、ガベージ・コレクション(GC)を除けば完全にスケーラブルな、理想的なシステムをモデル化したものです。赤色の線は、単一プロセッサ・システムではガベージ・コレクションにわずか1%の時間しかかからないアプリケーションを示しています。この場合、32個のプロセッサを搭載したシステムでは、スループットは20%を超えて低下します。赤紫色の線はガベージ・コレクションに10%の時間がかかるアプリケーション(単一プロセッサ・アプリケーションでガベージ・コレクションに費やされる時間としてあり得ない値ではありません)を示し、プロセッサを32個に拡張したときのスループットは75%を超えて低下してしまいます。

図1-1 ガベージ・コレクションに要した時間の割合の比較

図1-1の説明が続きます
「図1-1 ガベージ・コレクションに要した時間の割合の比較」の説明

このことから、小規模なシステムの開発では無視できる速度の問題が、大規模なシステムへと拡張すると重要なボトルネックになる可能性があることがわかります。ただし、このようなボトルネックを減らすように少し改善するだけで、パフォーマンスが大きく向上する可能性があります。十分に大規模なシステムでは、適切なガベージ・コレクタを選択し、必要に応じてチューニングする価値が大いにあります。

シリアル・コレクタは一般に(最新のプロセッサ上で、必要なヒープが最大でも100MB程度の)「小規模」アプリケーションのほとんどに適しています。他のコレクタは、特殊な動作の代償として、オーバーヘッドや複雑さが増加します。他のコレクタが備える特殊な動作をアプリケーションが必要としない場合には、シリアル・コレクタを使用します。シリアル・コレクタが最適な選択肢にならないのは、大容量のメモリーと2個以上のプロセッサを搭載したマシンで動作する、スレッド化の程度が非常に高い大規模なアプリケーションの場合です。このようなserver-classマシンでアプリケーションが動作している場合は、デフォルトでパラレル・コレクタが選択されます。「エルゴノミクス」を参照してください。

このドキュメントは、Solarisオペレーティング・システム(SPARC Platform Edition)上のJava SE 8を参照として使用し、作成されました。ただし、ここで紹介している概念および推奨事項は、Linux、Microsoft Windows、Solarisオペレーティング・システム(x64 Platform Edition)、OS Xなど、サポート対象のすべてのプラットフォームに当てはまります。また、説明したコマンド行オプションはすべてのサポート対象プラットフォームで使用できますが、一部のオプションのデフォルト値はプラットフォームごとに異なる場合があります。

目次      

Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved.