java.lang.OutOfMemoryError:使用apache POI读取excel文件时超出了“GC开销限制”

我们正在使用Apachi POI从excel文件中读取数据,它为我们的Selenium自动化测试用户提供了800行输入数据。 我们已经使用jenkins配置并执行了批处理作业,它工作了一年多。 但现在它显示错误“线程中的exception”主“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". 

请在此处找到附带的屏幕截图, 输入图像说明

此错误消息…

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

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

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

  • 通过命令行添加选项,关闭显示此错误消息的function:

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

     -Xmx1g 

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

  • 通过命令行对Concurrent Collection进行微调:

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

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

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

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

您可以在Error java.lang.OutOfMemoryError中找到详细讨论:超出GC开销限制