首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tomcat删除了"java.lang.OutOfMemoryError: Java堆空间“,但转储中的堆大小小于-Xmx

Tomcat删除了"java.lang.OutOfMemoryError: Java堆空间“,但转储中的堆大小小于-Xmx
EN

Stack Overflow用户
提问于 2014-03-26 08:22:52
回答 3查看 1.8K关注 0票数 5

我们的tomcat服务器丢弃了"java.lang.OutOfMemoryError: Java堆空间“,但是转储文件中的堆大小只有1.7GB,而-Xmx是4GB。

我不知道发生了什么事,你能帮帮我吗?

环境:红帽tomcat6 jdk6

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-04 17:42:15

XmxSIZE可能比Java转储更大,因为当您尝试分配一个大对象时会发生OutOfMemory

我们使用-Xmx1000m和670 MiB转储的应用程序在用户上传300 MiB附件时被OutOfMemory破坏。

我们在VisualVM中在System.arrayCopy上的“显示线程”跟踪中发现了这一点。引用从本地堆栈帧变量点到300个MiB字节数组。

现在,我们限制附件大小,并将应用程序从将来的崩溃中保存下来。

票数 2
EN

Stack Overflow用户

发布于 2014-03-27 09:51:27

萨拉赫的回答在很多方面都是错误的,我认为这是完全有害的。

首先,JVM不会在OutOfMemoryError死前触发停止World并清除堆。OOM的原因是GC未能清理内存,通常是在OOM之前的几十到数百次运行过程中。

其次,JVM供应商实际上并不推荐推荐的比率。最佳比率严重依赖于应用程序,因此,如果不知道您在做什么,最好还是保留默认设置,而不是遵循此建议。

票数 1
EN

Stack Overflow用户

发布于 2014-03-26 08:33:54

First您需要查看以下内存参数,它可能不会阻止OutOfMemoryError,但是您应该了解它们:

代码语言:javascript
复制
-Xmx2048m -> this param to set the max memory that the JVM can allocate
-Xms1024m -> the init memory that JVM will allocate on the start up
-XX:MaxPermSize=512M -> this for the max Permanent Generation memory

此外,您可能也希望检查这些参数,这些参数将加快年轻空间上的GC活动,因此集合会更好。

代码语言:javascript
复制
-XX:MaxNewSize=  -> this need to be 40% from your Xmx value
-XX:NewSize=614m -> this need to be 40% from your Xmx value

此外,您还可以告诉JVM使用什么样的GC类型(我认为这种类型已经在最新的JVM版本中启用):

代码语言:javascript
复制
-XX:+UseConcMarkSweepGC

第二

当发生OutOfMemoryError时,JVM将触发Stop World GC,因此它将收集您的对象和未引用的对象,这就是堆大小小于-Xmx值的原因。

通常在这种情况下,如果您使用其中一种分析工具分析这个堆,您将清楚地发现内存中的大对象,这些对象将引导您找到代码,并且很容易修复它。

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

https://stackoverflow.com/questions/22655126

复制
相关文章

相似问题

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