首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >jvm G1,内存是满的,满gc和失败有很多次,然后抛出OOM,5分钟或更长时间,为什么?

jvm G1,内存是满的,满gc和失败有很多次,然后抛出OOM,5分钟或更长时间,为什么?
EN

Stack Overflow用户
提问于 2022-01-15 01:26:51
回答 1查看 215关注 0票数 0

在我的演示项目中

69.741: [Full GC (Allocation Failure) 1023M->1023M(1024M), 1.1631632 secs]

关于30+时间,然后抛出OOM,大约1分钟。

相同的jvm参数,相同的代码。在我的在线项目(有zk,nacos,es,兔子,执行器.)关于5min+然后抛出OOM

我想要快速失败,能快速释放内存,那么我的在线项目有什么问题呢?我能做什么?

我还尝试更改java版本(JDK-11.0.13和1.8.0_301),结果是相同的

相同的jvm param

java -server -Xmx1024m -Xms1024m -Dapp.key=rrr -Dspring.profiles.active=docker -DskipTests -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -Duser.timezone=GMT+8 -Djava.net.preferIPv6Addresses=false -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:G1NewSizePercent=20 -Xloggc:./gcdemo.log -XX:+PrintHeapAtGC -Ddubbo.registry.address=*.* -jar ./demo3-0.0.1-SNAPSHOT.jar

相同的代码是

代码语言:javascript
运行
复制
    public Object ttttttsss() {

        List s = new LinkedList();
        while (true) {
            String uuid = UUID.randomUUID().
                    toString();
            uuid = uuid + uuid + uuid + uuid;
            s.add(uuid);
        }

    }
EN

回答 1

Stack Overflow用户

发布于 2022-01-15 01:36:48

你在堆里装满了一张大清单。GC尝试,尝试,并尝试继续进行。但是最终它达到了最大堆大小,您得到了一个OOME。

这个应用程序变慢的原因是你花了越来越多的时间收集垃圾。

为什么?

因为运行GC所需的时间与非垃圾对象的大小大致成正比。而且,由于您的列表中有越来越多的非垃圾(即可访问的)对象,所以每次运行GC将花费更长的时间。

此外,每次运行GC之间的时间也会减少,因为GC每次都能够找到减少垃圾的数量。最终JVM把所有的时间都花在无用的垃圾收集上..。然后它就不能再往前走了,它会抛出一个OOME。

这种行为模式有时被称为"GC死亡螺旋“。

如果您希望JVM避免在无用的GC中浪费时间并更快地失败,那么请设置-XX:+UseGCOverheadLimit选项。这告诉JVM,如果运行GC所花费的时间百分比超过了可配置的阈值,则抛出OOME。您可以在Oracle Java文档中找到更多细节。包括如何改变阈值。

资源:

  • 您正在使用的java命令的特定版本的手册页将列出最常见的GC调优选项.

+UseGCOverheadLimit,这应该是jvm中的默认配置吗?

默认情况下,该选项是否启用取决于(IIRC)版本。(因此要显式地设置它!)

,我记得我使用了这个配置,但是结果很差。

这取决于你的意思。

然而,有时把OOME抛得太早与允许重复GC使JVM屈服之间有一个明显的折衷。不幸的是,JVM无法在所有情况下做出最佳选择。(这需要它能够精确地预测应用程序需要多少内存。这显然是不切实际的。

无论如何,+UseGCOverheadLimit、增加最大堆大小和/或修复应用程序以减少堆内存是解决此行为的唯一可能方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70718210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档