首页 > 解决方案 > java.lang.OutOfMemoryError:超过 GC 开销限制”,同时使用 apache POI 读取 excel 文件

问题描述

我们正在使用 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".

请在此处找到参考输入图像描述的附加屏幕截图

标签: javaseleniumselenium-webdriverwebdriverapache-poi

解决方案


此错误消息...

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

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

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

解决方案

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

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

    -Xmx1g
    

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

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

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

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

    -XX:+CMSIncrementalPacing
    
  • 最后,确保您的程序中没有内存泄漏

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

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


推荐阅读