torutkのブログ

ソフトウェア・エンジニアのブログ

Javaナイトセミナーに参加(日本Javaユーザーグループ主催)

本日夜、JJUG(日本Javaユーザーグループ)主催のJavaナイトセミナー2月度に参加してきました。

Javaナイトセミナーは平日夜開催なので、参加できるかは仕事の状況によりますが、幸い今年度は参加できる機会が多くありました。さて、本日はJavaVM関係の話題3連発、オラクルのエンジニアの方々によるセッションです。

以下、セッションおよび懇親会での話題からそこはなとなく書き連ねます。セッションの報告ではありませんのであしからず。

1つ目のセッションは、技術評論社gihyo.jpにJVMの入門記事を連載している伊藤さんによるJavaVMのやさしい紹介(?)です。ちょっと遅れて到着したので、「庭」、「建物」に例えた説明が聞けませんでしたが、連載記事にあるそうです。URLは次です。本日時点で3回まで連載があり、まだ数回続くようです。

Cヒープ、スレッド・スタックを「庭」、Javaヒープを「建物」と喩えていたのですね。Cヒープは、I/O処理で使われるとか、DirectBufferはCヒープにとられるとか、懇親会の場ですがJRockitのネットワーク処理がCヒープで行われるといった、以外とCヒープが使われるということを知る良い機会だったと思います。

JavaヒープがすかすかでもCヒープが欠乏するとJavaVMが落ちてしまいます。Javaプログラマーもあまりそこまで意識しないと思いますが、I/Oで大量のデータを扱うとかJNIでネイティブライブラリを利用する際は要注意ですね。
これには過去トラブルにあったことがあります。JNI経由のネイティブライブラリ側のリソース解放をファイナライザーで呼び出す実装をしているものを使っており、Javaヒープは空きまくっていたのでファイナライザーが実行されず、Cヒープが枯渇したということがありました。周期的にSystem.gc()を呼び、またファイナライズスレッドが低い優先度なので別にファイナライズスレッドを作成して処理に充てるという対策をしました。System.gc()は、環境依存と3つ目のセッションで警告されてましたが、仕方がなかったかな。

ファイナライズスレッドといえば、セッションではJavaアプリケーションを実行すると生成されるスレッドの名前を問うとかちょっと初心者向けにはレベルが高い(でも勉強になる)話もありました。

2つ目のセッションは、羽生田さんによるjcmdの紹介です。jcmdはJava SE 7u4から搭載された診断コマンドで、既存のツール(jps, jstackなど)を1つのコマンドに合わせたようなもの+αです。JRockitの診断こまんどjrcmdのHotSpotVM版ということです。jcmdの名では情報が少ないかも。

セッションではいろいろコマンドの実行例を紹介していました。ちょっとコマンドに期待していたのですが、現行存在するコマンドと同レベルかなと、発表者の方も今後に期待とのことです。
なお、セッションのデモでは自分のPCにはない機能がリストにありました。フライトレコーダー関係の機能ですがこれは有償サポート(Java Advanced)を結んでいると利用できるとのことです。

なお、jcmdの応用例として、すでに稼働しているJavaVMをリモートからJMX接続可能に設定することで、従来は起動時にJavaVMオプションで指定しない限りリモートからJConsoleから接続することができなかったものを、途中で可能にすることができるとのことです(聞き違いでなければ)。

3つ目のセッションは立野さんによるJavaの環境依存の事例を交えた紹介です。
普段技術サポートをしており、それまでの段階で解決できなかった瀕死の案件が回ってくるそうです。心得として書籍「Java Puzzlers」を推薦していました。以外な落とし穴に備えるのによい本ということでした。

また、問題の原因は単純でも複数の振舞いが重なったときは問題が解明しづらく、解明できたときは単純な原因でなんだぁということもよくあることです。

Javaは他のプログラミング言語として落とし穴が少ない言語ですが、OSの違いといった環境により挙動が変わったり障害が起きることがあるよ、という流れでファイルシステムを例に深い話が展開されました。いや、これは開発システムでトラブルシュート経験があると実に考えさせられる内容です。高度ですが、初心者でもJavaプログラムが動くプラットフォームの違いが無視できないということを知るよいセッションだったと思います。
話題としては、ファイルシステムの違いによるファイルのタイムスタンプの分解能(NTFSは100ms、Linuxは1秒)での挙動の違いや、クローズし忘れたファイルを削除するときのOSによる違い(delete on last closeやsilly renameなど)とFileChannelにunmapがないけどどこでunmapしているかの追跡調査などいろいろいい話が続きました。

最後に、オラクルの寺田さんから5月にJava関係のイベント情報紹介がありました。

  • 5/11(土)JJUG CCC 2013 Spring
  • 5/14(火)Java丸1日セミナー(JavaOneの名ではなく)

懇親会帰りの深夜に書くとまとまりのない駄文になってしまいました。すみません。