【发布时间】:2011-08-23 14:51:07
【问题描述】:
我有一个 Java 应用程序来生成 Excel 工作表。我是根据 Apache POI 的 BigGridDemo Example 来生成 Excel(xlsx) 的。
这个想法是
- 创建模板工作簿、创建工作表和全局对象,例如单元格样式、数字格式等。
- 创建一个在文本文件中流式传输数据的应用程序
- 用生成的数据替换模板中的工作表
在 Linux 中,在第 3 步中,JVM 因此信息而崩溃
# A fatal error has been detected by the Java Runtime Environment:
# SIGSEGV (0xb) at pc=0x000000307a772c44, pid=11781, tid=1088649568
#
# JRE version: 6.0_24-b07
# Java VM: Java HotSpot(TM) 64-Bit Server VM (19.1-b02 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C [libc.so.6+0x72c44] memcpy+0x34
hs_err_pid 文件有这个 -
C [libc.so.6+0x72c44] memcpy+0x34
Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j java.util.zip.ZipFile.getNextEntry(JI)J+0
j java.util.zip.ZipFile.access$400(JI)J+2
j java.util.zip.ZipFile$2.nextElement()Ljava/util/zip/ZipEntry;+54
j java.util.zip.ZipFile$2.nextElement()Ljava/lang/Object;+1
当模板工作簿作为 zip 文件读取时,似乎会发生这种情况。这是执行此操作的代码。
ZipFile zip = new ZipFile(zipfile);
ZipOutputStream zos = new ZipOutputStream(out);
Enumeration<ZipEntry> en = (Enumeration<ZipEntry>) zip.entries();
while (en.hasMoreElements()) {
ZipEntry ze = en.nextElement();
if(!ze.getName().equals(entry)){
zos.putNextEntry(new ZipEntry(ze.getName()));
InputStream is = zip.getInputStream(ze);
copyStream(is, zos);
is.close();
}
}
如何避免这种崩溃?
【问题讨论】:
-
您是否添加了 -xMx 参数来增加 JVM 的大小?您是否正在运行可能设置该参数的东西(Tomcat、Jetty、JBoss)?当你这样做时,Linux 端的系统内存是什么样的?你的电量不足吗?
-
是的。当我也尝试使用 -Xmx1024m 和 2048 时,就会出现这种情况。我没有使用应用程序服务器运行。就像一个独立的 java 应用程序一样。机器内存充足(>15GB)。
-
我建议您从 BigGridDemo 切换到新的 SXSSF。它可以让您完成 BigGridDemo 所做的低内存写入,但使用更简单的 API
-
@Gagravarr,SXSSF 运行良好。谢谢。
标签: java crash zip apache-poi