如何防止 java.lang.OutOfMemoryError: GC 开销限制在 for 循环期间超出?

Posted

技术标签:

【中文标题】如何防止 java.lang.OutOfMemoryError: GC 开销限制在 for 循环期间超出?【英文标题】:How to prevent java.lang.OutOfMemoryError: GC overhead limit exceeded during for loop? 【发布时间】:2018-11-01 22:44:52 【问题描述】:

我总是在 for 循环中的随机时间遇到 GC 开销限制错误,在该循环中,我查看了从 Pgres 查询的 200K+ 记录。如何防止出现此错误?

当我遇到 OutOfMemoryError 时,我查看了 200K+ 条记录:

 final List<CustomerCSV> customerCSVs = new ArrayList<>();
 for (Record record : results) 
     final Iterable<String> tags = 
     Iterables.transform(record.get(CUSTOMER.TAGS), (part) -> StringUtils.chop(part.toString().substring(1)));
     customerCSVs.add(new CustomerCSV(record.get("name"), record.get("email"), Joiner.on(",").join(tags));

【问题讨论】:

How to deal with "java.lang.OutOfMemoryError: Java heap space" error (64MB heap size)的可能重复 超出 GC 开销限制并不(必然)意味着您的堆内存已用完。这意味着 GC 工作太辛苦了。这通常意味着你分配对象的速度非常快,而你的年轻代空间太小,所以有太多的对象被永久保存。 这是什么版本的 Java,你在 java 命令行上传递了什么选项? Java8 没有选项。 【参考方案1】:

您是否尝试过增加堆内存大小?

尝试在运行时添加以下参数: java -Xmx**m

我相信以上只是一个临时解决方案。或者我建议您按顺序获取记录。

https://www.postgresql.org/docs/9.5/static/sql-createsequence.html

【讨论】:

以上是关于如何防止 java.lang.OutOfMemoryError: GC 开销限制在 for 循环期间超出?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止用户重复提交数据

如何防止网站被*** 防止网站数据被***篡改

如何防止超卖

在winform当中提交数据,如何防止重复提交?

PostgreSQL如何防止表太大?

如何彻底防止SQL注入?