レポート

日立はJava VMでWebシステムのボトルネックをいかに回避したか~HITACHI Open Middleware World 2008 Autumn Cosminexus Dayから~

この記事を読むのに必要な時間:およそ 3 分

Cosminexus Day

2008年11月18日,株式会社日立製作所(以下,日立)が主催する「HITACHI Open Middleware World 2008 Autumn―Cosminexus DAY―」(以下Cosminexus Day)が東京・六本木で開催されました。ここでは,セッション「Inside Java VM ~先進のメモリ管理技術とは~」の話題を中心に,イベントの模様を振り返ります。

SOAプラットフォームCosminexus

Cosminexusは,日立のSOA(Service OrientedArchitecture)プラットフォームです。SOAに基づき,人の持つ知識・ノウハウとシステムの融合を加速することを特長としており,Cosminexus Dayでもそれに沿ったセミナーやワークショップが多数開かれました。

実践例や先進技術紹介など5コースのセミナー

当日は,午前に特別講演や基調講演,午後からはセミナーが主体となりました。セミナーは大きく分けて,実践例を中心とする「実践!SOA」,構築・運用手法を解説する「SOA構築と運用の勘所」,最新技術を紹介する「先端技術活用講座」,適用事例が中心の「Cosminexus適用事例」,認定技術者が対象の「Cosminexus V8研修」の5コースです。このうち「先端技術活用講座」でのJava VM(Virtual Machine)メモリ管理に関するセッションを,このあと詳しく紹介します。

また,ランチタイムには「1時間でわかるCosminexus Day!」と題する早わかり解説が設けられたほか,パートナー企業を含む製品やソリューションが展示され,それらの解説が聞けるワークショップにも多くの人が集まりました。すべてのセミナー修了後には,日立ソフトボール部の監督や選手も出席し,サインボールなどが当たる抽選会もあり,会場は大いに盛り上がっていました。

Inside Java VM~先進のメモリ管理技術とは~

(株)日立製作所 ソフトウェア事業部
第2APソフト設計部担当部長 中島恵氏

(株)日立製作所 ソフトウェア事業部 第2APソフト設計部担当部長 中島恵氏

Cosminexus Dayでは,「Inside Java VM ~先進のメモリ管理技術とは~」と題し,株式会社日立製作所ソフトウェア事業部 第2APソフト設計部 担当部長の中島恵氏によるセッションが開かれました。Java VMのメモリ管理にはどのような問題点があるのかを詳解するとともに,その解決策を紹介するもので,具体的には,Java VMがWebシステムのボトルネックになることを回避するFullGCレスを実現するしくみがCosminexus V8でどのように実現されているかを紹介するものでした。以降,その概要を紹介します。

Java VMのメモリ管理がボトルネックに

Webシステムが参照・更新するデータのサイズは,肥大化する一方で,どのようにシステムの安定稼働を実現していくかが大きな課題となっています。CPUの64ビット化でメモリ容量の増加は可能ですが,根本的な解決にはなりません。メモリ領域サイズの増大に伴って,Java VMのメモリ管理機能であるガベージコレクション(GC)による停止が長時間化するため,システムの性能劣化に陥ってしまうからです。そのため,こうしたGCに起因する問題を解消する新しい手法が必要になってきます。

Java VMにおけるGCのしくみ

解決策を探るために,まずはJava VMにおけるGCのしくみを詳しく見てみましょう。GCとは,Java VMが管理するメモリ領域(ヒープ領域)のうち使用済みの領域を破棄し,使用中の領域を整理して空き領域を作る動作です。Javaプロセスのメモリ領域にはJavaアプリが使用するJavaヒープ,クラスなどのメタ情報を格納するPermヒープ,Java VMやCプログラムが使用するCヒープ,スレッドごとに保持するスレッドスタックの4種類があります。このうち,GCの対象となるのはJavaヒープとPermヒープであり,パフォーマンスに大きく影響するのはJavaヒープに対するGCです。

さらに,Javaヒープは,New領域とOld領域に分けられます。New領域には,できたてのインスタンスを配置するEden領域と使用中のインスタンスを配置するSurvivor領域があります。Old領域には年齢の古いインスタンスを配置する業務プログラム使用領域,J2EEサーバが使用する領域,New領域用の退避領域があります図1)。

図1 Javaプロセスのメモリの内訳

図1 Javaプロセスのメモリの内訳

Copy GCとFull GC

GCにはCopy GCとFull GCの2種類があります。Copy GCはNew領域のみを対象に使用済みのインスタンスをすべて削除する動作です。Eden領域がいっぱいになると発生し,使用中のインスタンスは隣の領域へ移動します。New領域で最も古いインスタンスはOld領域に移されます。一方のFull GCは,すべての領域を対象に使用済みのインスタンスをすべて削除する動作です。Old領域の業務プログラム使用領域がいっぱいになると発生します図2)。

図2 Copy GCとFull GC

図2 Copy GCとFull GC

ここで問題になるのが,GCの実行に要する時間です。500M~1Gバイトのデータで比較した場合,Copy GCは0.01~0.7秒程度しかかかりませんが,Full GCでは1~数十秒も要してしまいます。Full GCは特に時間がかかり,Javaヒープのサイズ増加に比例して実行時間は増加します。またFull GCの実行中は業務処理が停止してしまうため,このボトルネックを解消する必要があります。

著者プロフィール

山本善之介(やまもとぜんのすけ)

フリーランスライター。富山県出身。プログラマから編集プロダクション勤務を経て,現在はIT系を中心に執筆活動中。趣味はPHPやVisual Basic,MySQLなどによるプログラミング,時刻表や地図を読むこと。池波正太郎と山本夏彦,小林よしのりのファン。

コメント

コメントの記入