講演「Javaでトランザクショナルメモリを使う」で、JVMに独自のトランザクショナルメモリ機構を実装するというユニークな試みについて発表したのは富士通の数村憲治氏だ。
トランザクショナルメモリはソフトウェアによる実装とハードウェアによる実装があるが、数村氏はインテルのHaswellアーキテクチャに搭載されたハードウェアトランザクショナルメモリ機構をJVMから利用できるようにしたという。
数村氏は、実装方法として「synchronizedの実装として使う」「APIとして提供」「特定ライブラリでの実装」の3つの方式を検討したが、実装の容易さと適用箇所を柔軟に設定できるという点から独自APIを用意する形とした。
効果を検証する上で、まずは実装自体のパフォーマンスを測定するため、データ競合(スレッド間で同じデータにアクセスするためのロック競合)が発生しないロジックでベンチマークを取ったところ、Javaで排他処理を書くのに一般的なsynchronizedを使った場合などと比べてかなり遅いことが判明した。
ネイティブコード呼び出し部分がボトルネックとなっていることが分かったため、トランザクショナルメモリ実装部がJITコード内でインライン展開されるよう最適化を施したところ大幅にパフォーマンスが改善されたとのことだ。
そこで初めてデータ競合が発生し得るロジックでベンチマークテストを行ったところ、3以上の多重度ではsynchronizedやReentrantLockを使ったケースよりも速いパフォーマンスをたたき出した。
今回の試みは既存のコードがそのまま最適化、高速化されるような方式ではないものの、ハードウェアトランザクショナルメモリの利用に今後大きな期待ができる結果といえるだろう。
数村氏は今回の独自実装とは別にOpenJDKで「-XX:+UseRTMLocking」というオプションを指定することでHaswellのトランザクショナルメモリ機能をsynchronizedブロックに利用する実装「JDK-8031320」が進んでいることを紹介した。残念ながら、その後Haswellのトランザクショナルメモリ実装は“まれ”に予期できない挙動を示すことがあるバグ「HSW136(英語)」が見つかっており、開発目的以外ではサポートされないこととなった。
次期アーキテクチャである「Browadwell」世代でも修正される見込みはなく、本格的に使えるのはBrowadwellのさらに次の世代以降となる見通しだ。高度にチューニングされたGCアルゴリズム、効率の良いネイティブコードを生み出すJITコンパイラー、優れたマルチスレッドモデルなどにより高いパフォーマンスが定評のJVMだが、今後も改善の余地があることは良いニュースだろう。
Web/スタートアップ周辺ではRubyやPythonといった動的言語が依然人気だが、ここ最近C#やScala、Swift、Go、TypeScriptといった静的型付き言語も人気だ。それとともに伝統的な静的型付け言語であるJavaはそのシンプルさ、パフォーマンスやスケーラビリティの高さ、そしてモダンな言語機能を搭載したJava 8のリリースもあり再び関心を呼んでいる。
年2回の大きなカンファレンスであるJJUG CCCの参加者は年々増えてきており、今回の「JJUG CCC 2014 Spring」は多くのセッションが立ち見となる盛況ぶりだった。次回のJJUG CCCも、一般公募を含めた多彩なセッションやワークショップでにぎわうことだろう。2014年11月15日に開催されるので予定を空けておいてはいかがだろうか。
山本裕介
Twitter APIのJava向けライブラリ「Twitter4J」やトラブルシューティングツール「侍」などを開発するオープンソースソフトウェアデベロッパ。
株式会社サムライズム代表。
Twitterアカウント:@yusuke
Copyright © ITmedia, Inc. All Rights Reserved.