【问题标题】:java.lang.OutOfMemoryError: GC overhead limit exceeded" while reading excel file using apache POIjava.lang.OutOfMemoryError:超过 GC 开销限制”,同时使用 apache POI 读取 excel 文件
【发布时间】:2023-04-07 04:03:01
【问题描述】:

我们正在使用 Apachi POI 从 excel 文件中读取数据,它有 800 行用于我们的 Selenium 自动化测试用例的输入数据。我们已经使用 jenkins 进行了配置并执行了批处理作业,并且它工作了一年多。但现在它显示错误“线程“main”中的异常 java.lang.OutOfMemoryError:超出 GC 开销限制”。当我们将 JVM 内存大小增加到 1024 MB 时,它工作正常。 excel文件大小只有68KB。但它显示GC错误。您能否帮助我们解决问题的原因。我们如何为这个问题提供永久修复。

  1. Excel 表格中的总行数为 800
  2. excel表格文件大小为68KB

获取错误信息为:

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded".

请查看附件截图以供参考 enter image description here

【问题讨论】:

  • @SiKing OP 提到了 apache-poiSeleniumJenkins,所有组件都需要 java 但 OP 并没有提到他在哪一行/步骤/阶段面临 OutOfMemoryError 错误。那么有什么理由抹去selenium 标签?
  • @DebanjanB 问题在于解析大型电子表格时内存不足。 Selenium、Jenkins 以及 OP 肯定使用的其他一些技术都是偶然的。

标签: java selenium selenium-webdriver webdriver apache-poi


【解决方案1】:

此错误消息...

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded".

...表示您的程序/脚本正忙于垃圾收集,JVM 无法执行任何进一步的任务。

根据Excessive GC Time and OutOfMemoryError OutOfMemoryError,如果 总时间的 98%JVM 会引发错误用于垃圾收集,不到2%堆内存被回收。引发此错误是为了防止应用程序长时间运行而在没有堆内存的情况下没有任何进展。

解决方案

  • 通过命令行添加一个选项来关闭显示此错误消息的功能:

    -XX:-UseGCOverheadLimit
    
  • 通过命令行增加堆大小为:

    -Xmx1g
    

注意:无论机器上安装了多少内存,默认的最大堆大小都不能超过1GB限制。 p>

  • 通过命令行微调并发集合为:

    -XX:CMSInitiatingOccupancyFraction=<N>
    
  • 启用增量模式:

    -XX:+CMSIncrementalMode
    
  • 启用自动步调:

    -XX:+CMSIncrementalPacing
    
  • 最后,确保你的程序中没有Memory Leaks

  • 最重要的是,尽可能地尝试重用现有对象以节省内存。

您可以在Error java.lang.OutOfMemoryError: GC overhead limit exceeded找到详细讨论

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 2016-09-01
    • 2020-09-08
    • 2020-07-24
    • 1970-01-01
    相关资源
    最近更新 更多