java - java.lang.OutOfMemoryError:超过 GC 开销限制”,同时使用 apache POI 读取 excel 文件
问题描述
我们正在使用 Apachi POI 从 excel 文件中读取数据,它有 800 行用于我们的 Selenium 自动化测试用例的输入数据。我们已经使用 jenkins 进行了配置并执行了批处理作业,并且它工作了一年多。但现在它显示错误“线程“main”中的异常 java.lang.OutOfMemoryError:超出 GC 开销限制”。当我们将 JVM 内存大小增加到 1024 MB 时,它工作正常。excel文件大小只有68KB。但它显示GC错误。您能否帮助我们解决问题的原因。我们如何为这个问题提供永久修复。
- excel表格中的总行数为800
- 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 无法执行任何进一步的任务。
根据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中找到详细讨论
推荐阅读
- xml - Hive XML Serde - 布尔 xpath 不解析
- ios - Unity 应用在构建到 ios 时将 URI 方案从 http 更改为 https
- java - 如果布尔值为真,如何返回字符串
- jenkins - 在构建失败时自动发送电子邮件 - Jenkins
- sql - SQL 优化案例 When (MSSQL)
- ssl - 如何在 SOAP UI 中将 TLS 版本从 1.1 更改为 1.2
- javascript - Angular - 简单的功能
- apache-pig - 需要在 PIG 中以特定格式将 chararray 转换为 datetime
- batch-file - 批处理 - 检查目录是否不存在不起作用
- ruby-on-rails - 将数据从视图发送到控制器 AJAX