Javaテクノロジが登場してから早20年以上経過しますが、その動作原理は大きくは変わっていません。 クラウド化に伴い、マシンリソースのスケールアップやスケールアウトが臨機応変に、場合によっては自動でできるようになってはいますが、アプリケーションレイヤやプラットフォームレイヤにおいては、実利用に際しての調整はやはり必要です。 お金で解決?いえいえ、むやみやたらとお金を使えばいいというわけではありません。Java の原理をしっかりと学んだ上で、ぜひSave your moneyな運用を実践しましょう。
オブジェクト指向言語固有の懸念事項
Java の原理をご紹介していく前に、オブジェクト指向 とは何でしょうか?
オブジェクト指向とは、現実世界をオブジェクト中心にモデル化する考え方 です。これによる恩恵は数多く存在し、こと顧客要求が随時変化する、または完全に定まらない状況下で、システム開発を強いられる現状においての適用度は、非常に高いといわれております。
とはいえ、実開発や運用においては 無数に存在するオブジェクトの管理 に頭を悩ませられるケースも多いようで、しばしば メモリリーク の原因となったり、深刻なパフォーマンス劣化 の原因となったりするケースがあります。
オブジェクトを生成すると、システム上(JVM内のヒープ)の リソースを消費 します。生成されたオブジェクトはいつか不要になり、適切なタイミングで破棄 する必要があります。
オブジェクトのライフサイクルとスコープ
プログラム実行時に生成される オブジェクトの種類 は多岐にわたり、コード内で生成されるオブジェクトに関わらず、アプリケーションサーバが生成 するもの 、利用しているフレームワークによって生成 されるもの 、JVM 自身が生成 するものがあり、それぞれによって特性が異なります。
これら全てのオブジェクトについては、JVM 内部の実行時データ領域 である ヒープ領域 に割り当てられます。ヒープ領域に割り当てられたオブジェクトはどのオブジェクトからも参照されなくなると、ガベージコレクション によって 回収 されます。その後、別のオブジェクトを割り当てることができるようにその領域は 解放 されます。
ガベージコレクションが動作するタイミングは、JVM 仕様では明確に決められておらず、HotSpot や、JRockit 等のJVM 実装に委ねられています。
ガベージコレクションの動作1 – 基本形 –
ガベージコレクションの動作 には様々なアルゴリズムがありますが、基本は Mark-Sweep-Compaction になります。
Mark-Sweep-Compaction
- Mark 参照可能なオブジェクトにフラグを付ける
- Sweep オブジェクトの使用している領域を解放する
- Compaction 連続したヒープ領域にオブジェクトが配置されるようにして圧縮する
しかしながら、この動作は 動作コスト が大きく、一度発生すると アプリケーションの応答が停止 することが知られています(Stop-The-World)。
また、この停止時間は ヒープのサイズが大きければ大きいほど長くなり(数十秒~数分)、Javaシステムの性能用件上の大きな問題としてしばしば話題にあがります。ヒープサイズが小さく常にオーバーフローと隣り合わせの状況ではその頻発によりアプリケーションの動作がほとんど行われない状況に陥る可能性もあります。
オブジェクトの世代を考慮しないガベージコレクタ
ガベージコレクションの動作2 – 世代別管理 –
本記事は、日本サード・パーティ株式会社(JTP)にて、執筆しています。
JTPは約30年に渡り、様々なベンダーのサポートを行う企業です。 設計、構築、開発、運用、ヘルプデスク、トレーニングなど、ITのライフサイクルを通して技術サービスを提供しています。
中でも、JTP の IT教育サービスでは、クラウド、Hadoop関連技術など、OSS の最新技術 トレーニングを数多く実施しています。
JTPでは、経験豊富なエンジニア、講師陣により、多くの技術記事を公開しております。
▼JTPの情報メディア「JTP Technology Port」はこちらから!