【技術解説】進化したJava VM ガーベッジコレクション
はじめに
みなさん、こんにちは。Azul Systems, Inc.のセールスエンジニア、北村浩一です。
本ブログでは、最新サーバーテクノロジーにあわせて進化してきたJava VM(仮想マシン)の必須かつ基礎技術であるガーベッジ・コレクション(GC - Garbage Collection)を主軸として、本日現在利用可能なGCアルゴリズムを比較します。
電子計算機の歴史をひもときますと、世界最古の高級プログラミング言語のひとつであるLispは、自動メモリ管理機能を持ち、ガーベッジ・コレクション処理を行います。効率的なガーベッジ・コレクションの処理方法やアルゴリズムの研究は高級プログラミング言語のメインテーマのひとつを言えるでしょう。
※ガーベッジ・コレクション:実行中のプログラムが占有していたメモリ領域のうち不要になったものを自動的に解放し、空き領域として再利用できるようにする機能。
このために、GCってチョット深堀りすると、学術論文やJEP(Java Enhancement Proposal)原文を読む羽目に陥る深い沼であり、計算機ハードウェアとソフトウェア(オペレーティング・システム)が融合するゾーンということで、誰にとっても難解極まる可能性があります。
そこで本記事では、大胆不敵にも5つの共通要素を選び、GCアルゴリズムの要点を整理してみました。
進化したGCアルゴリズムの共通要素
今日、サーバーサイドのオペレーティング・システムは、オープンソースソフトウェアであるLinuxが中心となっています。ARMプロセッサのサーバサイド展開も起こるでしょうが、今のところエンタープライズ・コンピューティングのプロセッサはインテル系の64ビットマルチコア製品が支配的です。近年のテクノロジートレンドを見渡し、私的かつ大雑把なGCアルゴリズムの共通要素を5つ挙げてみました。
SMP(Symmetric Multi-Processor)前提
同種類・同ビット長のレジスタ群を持つ複数のコアが一つのチップ上に実装され、多段キャッシュメモリの先に、主記憶メモリを共有するアーキテクチャーです。JIT(Just In Time)コンパイラによる最適化やマシン語変換するのにも、GC処理を実行するのにも、実行スレッドと計算脳力が必要になりますので、複数コアで並列実行できることはJavaプログラム本来の高速実行に寄与します。
NUMA(Non-Universal Memory Access)対応
各コアが主記憶メモリを持ち、別コア配置される主記憶メモリには、クロスバーやインターコネクトといった仕組みでリモートアクセスするアーキテクチャーです。あるコアにローカルに配置しているメモリには高速にアクセスできます。インテル系サーバプロセッサが多段キャッシュメモリを装備する理由は、複数コアから共有主記憶メモリへのアクセスには<待ち合わせ>が生じ、また演算処理に比較すると5倍から10倍も手数がかかる処理であるため、主記憶メモリをコアに分配して配置します。
JITコンパイラとの協調動作
JavaプログラムはJava VM内部でマシン語にコンパイルされることで初めて高速動作可能になりますが、高効率GC処理のために、JITコンパイル時にGC処理に適したマシン語を生成します。複数コアで並列処理するためには、影響の出ない範囲で処理順序が入れ替えられたりします。Javaアプリケーションの実行スレッドが、並列して動作するGC処理スレッドと干渉する可能性も高まるため、メモリバリア命令を挿入することで防ぎます。
ポーズ時間コントロールがメインテーマ
Java VMのGCアルゴリズムは、マーク&スイープ型と呼ばれます。この「マーク」処理中には、メモリを書き換える可能性のあるJavaプログラムの動作を完全に停止させる時間、つまりポーズ時間が必要です。ありていに言えば、ヒープメモリが大きければ大きいほど、ポーズ時間は長くなるのですが、メモリ利用を分割したり、処理時間に上限を設ける等の方法でポーズ時間を管理しようという試みです。
OpenJDKベース
JDK 6から存在するOpenJDKは、Java 11からメインストリームとなりました。オラクル社とレッドハット社のエンジニア達が半年ごとのメジャーバージョンでJava VMの新GCアルゴリズムを実装しています。Javaで書かれた分散処理フレームワークや分散データベースは、ビッグデータ処理時には、数100GB規模のヒープサイズを持つ可能性があります。GCにより、STW(Stop The World)、つまりストップ・ザ・ワールドというJavaアプリケーションが長時間停止する状況を避けるため、新GCアルゴリズムの実装が数年前から加速し、最新LTS(ロングタームサポート)JDK 17では新規開発されたGCは「実験的」ではなくなっています。
Azul Platform Prime JVM
本日現在、64bitインテルサーバプロセッサとLinux系OSのみサポートするAzul Platform Primeは、OpenJDKベースの有償Java VMであり、下記の特徴を持っています。
・C4(Continuously Concurrent Compacting Collector):ポーズレスGCアルゴリズム
・Falcon JIT:C4に合わせた高効率ネイティブコードを生成するサーバコンパイラ
・ReadyNow!:C1コンパイル情報を外部記憶へ保存、JVM起動時集中コンパイル
コンテナ環境や技術評価に便利なストリームビルドは、Azulのリポジトリから容易にインストール可能です。アプリケーションはリコンパイルなし(ドロップイン)でリプレース可能です。
前述の共通要素に沿って、進化したGCアルゴリズムを備えるJVMの比較表を作りましたのでご興味のある方は以下よりダウンロードのほどお願いいたします。
資料ダウンロードはコチラ。
JEPや一部技術論文を自動翻訳も使って読み、まとめたものです。
おわりに
このように進化したJava VMガーベッジ・コレクションには、複数の選択肢が存在し、比較できることを示しました。Java VMはC/C++プログラミング言語で書かれており、最新GCアルゴリズムはOSのメモリモデルやシステムコールを活用して構築されています。
貴方の組織に計算機学科の修士卒はいませんか?彼らはインタプリタやコンパイラをつくる演習をパスしているはずです。ぜひ筆者に紹介してください!
関連リンク
資料ダウンロードはこちら
フォームに必要事項を記入いただくことで、資料がダウンロードできます。
この記事の著者:北村浩一
2019年4月に本社採用されて、早いもので二年半、SNSの更新が間に合わないほど大変多忙な毎日を過ごしています。Azulは米国西海岸シリコンバレーに本社を置く、2005年設立100% Javaフォーカスの組織です。私は採用面接から今まで、東京からシリコンバレーに通勤することはできませんから、半年に一度の本社訪問を除き99.9%ほどテレワーク中。国内外の採用事例をベースとして、お客様により深く広くJavaインフラの理解いただくことをモットーに日々活動しています。趣味は、健康食とダイビングを少々。
DevOps Hubのアカウントをフォローして
更新情報を受け取る
-
Like on Facebook
-
Like on Feedly