Jasper report exporting to text results in java.lang.OutOfMemoryError: Java heap space
Jasper report exporting to text results in java.lang.OutOfMemoryError: Java heap space
目前我正在使用 jasper v 3.7.4
从同一个 dataset
导出为任何其他格式(csv
、xls
、pdf
)时 - 我没有任何问题。
导出到 text
抛出:
java.lang.OutOfMemoryError: Java heap space at
java.util.Arrays.copyOf(Arrays.java:3236) at
java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
这是我的代码:
byte[] bytes = null;
JRTextExporter exporter = new JRTextExporter();
ByteArrayOutputStream txtReport = new ByteArrayOutputStream();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, txtReport);
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, "mytxt.txt");
exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8");
exporter.setParameter(JRTextExporterParameter.CHARACTER_WIDTH, 2.0F);
exporter.setParameter(JRTextExporterParameter.PAGE_WIDTH, 100.0F);
exporter.setParameter(JRTextExporterParameter.CHARACTER_HEIGHT, 4.0F);
exporter.setParameter(JRTextExporterParameter.PAGE_HEIGHT, 50.0F);
exporter.exportReport();
bytes = txtReport.toByteArray();
FileOutputStream fos = new FileOutputStream("c:\myfile.txt")
System.out.println(bytes.length/1024+" Kbytes");
fos.write(bytes, 0, bytes.length);
fos.flush();
fos.close();
我也在使用 virtualizer
作为 jasperPrint
参数
JRFileVirtualizer virtualizer = new JRFileVirtualizer(150);
virtualizer.setReadOnly(false);
params.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
但这并没有帮助,还显示了以下警告:
WARNING: Parameter "REPORT_VIRTUALIZER" already registered, skipping
this one.
鉴于csv
也是一个“text
”文件并且生成没有任何问题,有点奇怪
导出到 text
失败。
可能是我提供给出口商的参数有问题?
谢谢。
虽然 text
和 csv
可能都是 基于文本的 格式,但它们 不同 格式,因此不要采用相同数量的 space.
向内存生成任何内容(通常是报告)是危险的,因为虽然它可能在测试中有效,但在生产中导致 OOME 的大型报告会造成严重破坏。
生成内容时使用真实流。 FileOutputStream
,网络流,任何不在内存中存储内容的适当流。如果您将 ByteArrayOutputStream
用于“实际工作”,您很可能做错了什么。
立即将报告输出到文件,而不是先收集它。
try (FileOutputStream fos = new FileOutputStream("c:\myfile.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos)) {
JRTextExporter exporter = new JRTextExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, bos);
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, "mytxt.txt");
exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8");
exporter.setParameter(JRTextExporterParameter.CHARACTER_WIDTH, 2.0F);
exporter.setParameter(JRTextExporterParameter.PAGE_WIDTH, 100.0F);
exporter.setParameter(JRTextExporterParameter.CHARACTER_HEIGHT, 4.0F);
exporter.setParameter(JRTextExporterParameter.PAGE_HEIGHT, 50.0F);
exporter.exportReport();
}
目前我正在使用 jasper v 3.7.4
从同一个 dataset
导出为任何其他格式(csv
、xls
、pdf
)时 - 我没有任何问题。
导出到 text
抛出:
java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3236) at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
这是我的代码:
byte[] bytes = null;
JRTextExporter exporter = new JRTextExporter();
ByteArrayOutputStream txtReport = new ByteArrayOutputStream();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, txtReport);
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, "mytxt.txt");
exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8");
exporter.setParameter(JRTextExporterParameter.CHARACTER_WIDTH, 2.0F);
exporter.setParameter(JRTextExporterParameter.PAGE_WIDTH, 100.0F);
exporter.setParameter(JRTextExporterParameter.CHARACTER_HEIGHT, 4.0F);
exporter.setParameter(JRTextExporterParameter.PAGE_HEIGHT, 50.0F);
exporter.exportReport();
bytes = txtReport.toByteArray();
FileOutputStream fos = new FileOutputStream("c:\myfile.txt")
System.out.println(bytes.length/1024+" Kbytes");
fos.write(bytes, 0, bytes.length);
fos.flush();
fos.close();
我也在使用 virtualizer
作为 jasperPrint
参数
JRFileVirtualizer virtualizer = new JRFileVirtualizer(150);
virtualizer.setReadOnly(false);
params.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
但这并没有帮助,还显示了以下警告:
WARNING: Parameter "REPORT_VIRTUALIZER" already registered, skipping this one.
鉴于csv
也是一个“text
”文件并且生成没有任何问题,有点奇怪
导出到 text
失败。
可能是我提供给出口商的参数有问题?
谢谢。
虽然 text
和 csv
可能都是 基于文本的 格式,但它们 不同 格式,因此不要采用相同数量的 space.
向内存生成任何内容(通常是报告)是危险的,因为虽然它可能在测试中有效,但在生产中导致 OOME 的大型报告会造成严重破坏。
生成内容时使用真实流。 FileOutputStream
,网络流,任何不在内存中存储内容的适当流。如果您将 ByteArrayOutputStream
用于“实际工作”,您很可能做错了什么。
立即将报告输出到文件,而不是先收集它。
try (FileOutputStream fos = new FileOutputStream("c:\myfile.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos)) {
JRTextExporter exporter = new JRTextExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, bos);
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, "mytxt.txt");
exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8");
exporter.setParameter(JRTextExporterParameter.CHARACTER_WIDTH, 2.0F);
exporter.setParameter(JRTextExporterParameter.PAGE_WIDTH, 100.0F);
exporter.setParameter(JRTextExporterParameter.CHARACTER_HEIGHT, 4.0F);
exporter.setParameter(JRTextExporterParameter.PAGE_HEIGHT, 50.0F);
exporter.exportReport();
}