xmlからmemcachedへデータを書き出すjavaプログラムをつくった。
xml parserとしてjava 1.6標準のStAXライブラリがあるが、
これが曲者であった。
巨大ファイルを扱ってもOutOfMemoryErrorにならないはずだが、
OutOfMemoryErrorに。
自分のコードをさんざん疑って時間を浪費したが、
なんとこれはライブラリのほうのバグであった・・・
xml parseで、apache xercesを使っている部分があるらしいのだが、
そこでchar[]にストリームをため込み続けてOutOfMemoryに至るよう。
memory analyzerのメッセージを読んだときは最初???だった。
ちなみにこれはjava 1.6 update 14で修正されたというアナウンスがあったらしいが、
直ってないらしい・・・
結局、海外サイトの掲示板で書かれていた方法で対処。
woodstoxという同じくStAXを扱うjava StAXからの拡張ライブラリがあり、
そちらを使用。
といってもコードを書き換える必要はなく、
classpathでライブラリのjarを含めるだけ。
これで、巨大XMLファイルでも、低ヒープメモリで扱えるようになった。
(apache xercesのほうのライブラリをclasspathに含めてもいけるかもしれない、が試していない)