【问题标题】:Java - Apache poi leads to java.lang.OutOfMemoryError: GC overhead limit exceededJava - Apache poi 导致 java.lang.OutOfMemoryError: GC 开销限制超出
【发布时间】:2018-10-31 07:46:07
【问题描述】:

我正在尝试打开一个大小为 22MB 并包含 9905 行(在我看来不是那么大)的 excel 文件。

我尝试用java apache poi这样打开它:

final File f = Utils.getFileWithRespectToJar(this, filename);
final Workbook workbook = WorkbookFactory.create(f);

final Sheet sheet = workbook.getSheetAt(0);
final int maxRowLength = sheet.getLastRowNum();

几秒钟后,java 占用了大约 3.3GB 的 RAM 和 90% 的 CPU,大约一分钟后,我的 eclipse 项目崩溃了

java.lang.OutOfMemoryError: 超出 GC 开销限制

apache poi 表现不佳还是我做错了什么?

编辑:我之前使用的是 .xlsm 文件(启用了宏的 excel 文件)。我再次将其保存为.xlsx 文件(禁用宏)并将堆大小增加到4GB。现在,在我的 Eclipse 应用程序崩溃之前,java 占用了 4GB 的 RAM (=90%) 和 90% 的 CPU 大约 15 分钟。 我正在使用 apache poi 3.16 并更新了我的 maven pom 文件以使用 4.0.0 (最新版本),但这个新版本的工作方式不同,所以我得到了很多例外,例如:

org.apache.poi.ooxml.POIXMLException: org.apache.xmlbeans.XmlOptions.setEntityExpansionLimit(I)Lorg/apache/xmlbeans/XmlOptions; 在 org.apache.poi.ooxml.POIXMLFactory.createDocumentPart(POIXMLFactory.java:66) 在 org.apache.poi.ooxml.POIXMLDocumentPart.read(POIXMLDocumentPart.java:648) 在 org.apache.poi.ooxml.POIXMLDocument.load(POIXMLDocument.java:180) 在 org.apache.poi.xssf.usermodel.XSSFWorkbook.(XSSFWorkbook.java:286) 在 org.apache.poi.xssf.usermodel.XSSFWorkbookFactory.createWorkbook(XSSFWorkbookFactory.java:83) 在 org.apache.poi.xssf.usermodel.XSSFWorkbookFactory.createWorkbook(XSSFWorkbookFactory.java:111)

引起:java.lang.NoSuchMethodError: org.apache.xmlbeans.XmlOptions.setEntityExpansionLimit(I)Lorg/apache/xmlbeans/XmlOptions; 在 org.apache.poi.ooxml.POIXMLTypeLoader.(POIXMLTypeLoader.java:43) 在 org.apache.poi.xssf.model.ThemesTable.(ThemesTable.java:86)

【问题讨论】:

  • 尝试使用 Streaming API。见:stackoverflow.com/questions/33786219/…
  • 从 Excel 文件打开工作簿不仅是读取文件的字节,还创建工作簿、工作表、工作表的共享字符串、单元格中的公式之间的所有关系,单元格样式,......所以这需要多少内存取决于工作簿的内部结构以及有多少这样的关系。因此,如果没有 Excel 文件,大多数情况下都无法回答此类问题。
  • 乱用不同版本的apache poi不会成功。如果使用 apache poi 3.16 会导致GC overhead limit exceeded,那么使用 apache poi 4.0.0 也会导致这种情况。更新到最新版本会很好。但是必须更新所有依赖项。不支持不同版本的混合。
  • 好的,我现在更新了我使用的所有依赖项,再试一次:)

标签: java javafx apache-poi


【解决方案1】:

我删除了所有单元格格式和宏,所以现在基本上 excel 文件只有黑色文本,apache poi 不再崩溃。

【讨论】:

  • 因此,存储单元格及其单元格样式之间的关系以及可能在共享字符串表中的富文本所需的内存是最后一根稻草。大多数程序员不理解将Excel 作为 GUI 运行(它可以完全访问运行 GUI 的客户端系统的所有内存)与在服务器系统中运行apache poi(它只能部分访问)之间的区别到服务器的内存,因为其他服务器进程也需要内存。因此,“apache poi 表现不佳”的说法是不正确的。
猜你喜欢
  • 2017-12-27
  • 2020-09-08
  • 2020-07-24
  • 1970-01-01
  • 2019-06-29
  • 2015-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多