当我以doc格式导出内容时,我得到java堆空间错误,
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.io.ByteArrayOutputStream.write(Unknown Source)
at sun.nio.cs.StreamEncoder.writeBytes(Unknown Source)
at sun.nio.cs.StreamEncoder.implWrite(Unknown Source)
at sun.nio.cs.StreamEncoder.write(Unknown Source)
at sun.nio.cs.StreamEncoder.write(Unknown Source)
at java.io.OutputStreamWriter.write(Unknown Source)
at java.io.Writer.write(Unknown Source)
答案 0 :(得分:6)
最佳添加
-XX:+HeapDumpOnOutOfMemoryError
在发生OutOfMemoryError时创建heapdump,然后使用例如分析堆转储来分析堆转储。 Eclipse Memory Analyzer将显示对象的数量,通常可以清楚地识别导致OutOfMemory错误的对象。
答案 1 :(得分:3)
java.lang.OutOfMemoryError: Java heap space
Java只是内存不足。它不能再分配更多的内存了。堆栈跟踪的残余是无关紧要的,它恰好发生在数组复制操作期间。它可能发生在任何地方。
显然,您正在尝试根据极大的数据集(可能有数千或数千条记录)生成报告,或者您提供的JVM内存太少。然后,您应该确保JVM有足够的内存来处理所有数据。默认值为128MB或256MB,具体取决于所使用的JVM和环境。使用JVM的-Xmx
参数开始将该数量加倍。
E.g。
java -Xmx512M (other arguments here)
您可能还希望profile您的应用程序检查它实际使用的内存量,然后优化该参数。
另一方面,如果您正在处理非常很多的数据,那么请考虑将其分成几部分,例如:首先是第一千条记录,然后是第二千条记录,等等。
答案 2 :(得分:1)
尝试增加JVM启动的内存,并可以将其用作MAX。
将这些参数添加到启动程序
-Xms500M
用你希望JVM开始的许多megs替换500.
-Xmx500M
用你希望JVM可以使用的最大内存来替换500多个megs。
答案 3 :(得分:1)
如果数据集很大,那么您需要分页报告生成本身。我正在为jasper报告做一些研究大型数据集,并发现this文章非常有用。
答案 4 :(得分:1)
您应该使用jasper报告的Virtualizers功能。请参阅文章here。
答案 5 :(得分:0)
通常的报告不需要大量的内存。你的文件太大了吗?
也许贾斯珀报告无限循环。修改log4j级别以获得有关正在发生的事情的更多线索。尝试删除一些部分,以了解卡在哪里。
我使用了Jasper Reports并得到了一些像这样的错误。有时Jasper Reports的行为很奇怪。
祝你好运。答案 6 :(得分:0)
您可以在setenv.bat文件中更改内存参数。下面是相同的路径。
jasperhome / apache-tomcat / bin / setenv.bat
在这里,您可以根据需要更改 JvmMs 和 JvmMx 参数。更改参数后,您需要重新启动jasper服务器。一种方法是通过任务管理器重新启动jasper服务。
答案 7 :(得分:0)