2013/09/12

JasperReport PDF生成時に OutOfMemory Error発生

 久々にJavaに関わったのでレポートしておきます。
 WebでJava環境でシステム構築となると、帳票作成は色々あれどJasperReportを使うことが多いようです。
 JasperReportでわかったのですが、多めの帳票を出力するとOufMemoryでJavaが異常終了するようです。
 現在Eclipse上でJavaのメモリ監視を行えるものがないか調べて見ました。

 Memory Analyzer というプラグインを見つけました。

 このツールでは、Javaの起動オプションを指定し、メモリダンプ採取後に解析することと、Eclipseのプラグインとして導入して、Eclipseの画面からメモリダンプ採取及びダンプ解析が行えます。

 メモリダンプ採取後に解析する方法については、以下のサイトに記載がありました。
 http://daybreaksnow.hatenablog.jp/entry/2013/02/19/211924

 プラグインとして使用する方法は、以下のサイトに記載がありました。
 http://tlync.hateblo.jp/entry/20111220/1324372308

 結局のところ、プラグインとして使用する方法を利用して調査したところ、JasperReport.exportToPDFでメモリ不足が発生していることを発見。
 ただ、このメソッドは、JasperReportの内部処理なので、お手上げ状態に思えたのですが、調べるとあるものですね。
 以下のサンプルを見つけました。当処理を導入することで、PDF編集をメモリ上ではなくワークファイル上で行うようになるようです。

 http://community.jaspersoft.com/questions/529773/export-huge-pdf

 サンプルには記載がありませんでしたが、状況によってはかなりの数のワークファイルを作ることもあり、ワークファイルを必ず削除するようにしないと色々トラブルになりそうです。

 ということで、筆者は以下の処理を実装しました。

        JRFileVirtualizer virtualizer = new JRFileVirtualizer(2, System
                .getProperty("java.io.tmpdir"));
 
        Map parameters = new HashMap();
        parameters.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
        return JasperFillManager.fillReport(jasperReport, parameters,
            dataSource);
        virtualizer.cleanup();
        virtualizer = null;

 Windowsでは java.io.tempdir は c:\users\ユーザ\Appdata\Local\Temp のようです。
 念の為、組み込まれた場合、こちらのフォルダを確認してみてください。

 困っておられる方、いらっしゃいましたら参考にしてください。

0 コメント:

コメントを投稿