待ちに待っていた,Java SE 6がもうすぐリリースされます。されるはずです。されると思うのですが...

なぜ,こんなに弱気なのかというと,もともとJava SE 6は今年5月のJavaOneの前にリリースされるされる予定でした。それが,10月に延び,さらに12月に延びたという経緯があるのです。

とはいうものの,最近のビルドでは新しい機能の追加はほとんどなく,バグフィックスがほとんどです。リリースが近いことは確実なようです。

そこで,今月からJava SE 6について取り上げていこうと思います。

Java SE 6では,スクリプトのサポートやWebサービス系のAPIが導入されたことなどが話題になりますが,それ以外にもたくさんの機能が取り入れられています。機能としてみればたいしたことがなくても,役に立つ機能が多くあるのです。

少しでも早くJava SE 6を試してみたいと思われる方も多いでしょう。Java SE 6の特徴として,java.netのJDK 6プロジェクトでほぼ毎週ビルドが公開されていることがあります。バイナリだけでなく,ソースもほぼすべて公開されています。最新のビルドをいつでも試せるのですから,これを逃す手はありませんよ。

なお,今月はJDK 6 build 99を使用していきます。12月に正式にリリースされるJava SE 6とは動作が異なる可能性がありますが,ご了承ください。

OutOfMemoryErrorのハンドリング

まず,はじめに取りあげるのは,OutOfMemoryErrorのハンドリングについてです。

意外ではないですか?

Java SE 6といえば,スクリプトのサポートやWebサービスが取り上げられることが多いはずです。ところが,OutOfMemoryErrorなんて。

もちろん,スクリプトやWebサービスは重要な機能です。しかし,筆者はOutOfMemoryErrorのハンドリングなどを含んだ,Javaの保守,管理に関する機能が,より重要であると考えています。Java SE 6で導入された新しい機能を全く使わなくても,Java SE 6に移行するだけでデバッグや保守が格段にしやすくなるのです。

さて,本題のOutOfMemoryErrorのハンドリングです。

とりあえず,説明は抜きにして,以下のプログラムを実行してみてください。なお,import文は省略してあります。

public class OutOfMemorySample {
    private static final String FORMULA = "Hello, World! ";
    private List messages = new ArrayList();
 
    public OutOfMemorySample() {
        while(true) {
            appendMessage();
        }
    }
 
    private void appendMessage() {
        messages.add(FORMULA);
    }
 
    public static void main(String[] args) {
        new OutOfMemorySample();
    }
}

ごくごく簡単なプログラムなので,解説する必要はないですね。単にリストに文字列を追加していくだけのプログラムです。

このプログラムをJ2SE 5.0で実行してみると...

C:\temp>java OutOfMemorySample
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

当然のごとく,OutOfMemoryErrorが発生しました。OutOfMemoryErrorの発生は想定どおりなのですが,問題はどこでOutOfMemoryErrorが発生したかということです。

このぐらいの小さなプログラムだと,OutOfMemoryErrorの発生個所はすぐわかります。しかし,大規模なシステムになれば,OutOfMemoryErrorの発生源を探すのは並大抵のことではありません。にもかかわらず,OutOfMemoryErrorが発生したときにスタック・トレースが表示されないのは大問題です。

それでは,このプログラムをJava SE 6で動かしてみましょう。

C:\temp>java OutOfMemorySample
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOf(Arrays.java:2760)
        at java.util.Arrays.copyOf(Arrays.java:2734)
        at java.util.ArrayList.ensureCapacity(ArrayList.java:167)
        at java.util.ArrayList.add(ArrayList.java:351)
        at OutOfMemorySample.appendMessage(OutOfMemorySample.java:17)
        at OutOfMemorySample.(OutOfMemorySample.java:12)
        at OutOfMemorySample.main(OutOfMemorySample.java:21)

こんどはちゃんとスタック・トレースが表示されました。このスタック・トレースから,リストの容量を増やして要素のコピーを行っている部分でOutOfMemoryErrorが発生していることがわかります。

これならば,どこに問題があるか一目瞭然です。

OutOfMemoryErrorでスタック・トレースが出ることなど,機能としてみればほんのわずかなことかもしれません。しかし,こんなわずかな機能であっても,デバッグの効率は雲泥の差です。

逆にいえば,なぜこんな簡単なことを今までできなかったのだろう,という感じですね。

なにはともあれ,この機能だけでもJava SE 6に乗りかえる価値はありますよ。

第2回を読む

著者紹介 櫻庭祐一

横河電機 ネットワーク開発センタ所属。Java in the Box 主筆

今月の櫻庭

秋ですねぇ。秋といえばやっぱり栗。洋栗もいいですが,和栗もおいしい。ナポリの栗を使ったSadaharu AOKIのマロニエ・オ・ショコラや,ラ・プレシューズの和栗のモンブランなど,おいしい栗のお菓子がいろいろ。

その中でも櫻庭がお勧めなのはピエール・エルメのマカロン マロン エ テベール マッチャ 。マロンのマカロンに,抹茶のクリーム。そして,クリームの中にはマロングラッセが入っています。抹茶とマロングラッセという組み合わせは絶妙です。

と,今日もまた体重を気にしつつ,プログラミングしています。