待ちに待っていた,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 Listmessages = 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に乗りかえる価値はありますよ。
著者紹介 櫻庭祐一 横河電機 ネットワーク開発センタ所属。Java in the Box 主筆 今月の櫻庭 秋ですねぇ。秋といえばやっぱり栗。洋栗もいいですが,和栗もおいしい。ナポリの栗を使ったSadaharu AOKIのマロニエ・オ・ショコラや,ラ・プレシューズの和栗のモンブランなど,おいしい栗のお菓子がいろいろ。 その中でも櫻庭がお勧めなのはピエール・エルメのマカロン マロン エ テベール マッチャ 。マロンのマカロンに,抹茶のクリーム。そして,クリームの中にはマロングラッセが入っています。抹茶とマロングラッセという組み合わせは絶妙です。 と,今日もまた体重を気にしつつ,プログラミングしています。 |