Tomcat7 java.lang.OutOfMemoryError:Java 堆空间
Posted
技术标签:
【中文标题】Tomcat7 java.lang.OutOfMemoryError:Java 堆空间【英文标题】:Tomcat7 java.lang.OutOfMemoryError: Java heap space 【发布时间】:2015-04-24 17:29:40 【问题描述】:我正在运行 tomcat7 服务,该服务处理来自客户的大量负载。我在一个周末离开了应用程序,当我回来时,我注意到 tomcat CPU 使用率增加到 99%,并且在日志中我发现了以下错误:
Exception in thread "http-bio-8080-exec-908" java.lang.OutOfMemoryError: Java heap space
Exception in thread "http-bio-8080-exec-948" java.lang.OutOfMemoryError: Java heap space
这是否意味着在我遇到 OutOfMemory 异常时,我打开了 908 和 948 个活动线程?
目前我的 tomcat 在默认配置下运行,我还没有增加堆大小。
我们收到了大约200 queries/sec
。
My hardware:
CPU : Intel(R) Xeon(R) CPU X5650 @ 2.67GHz
Memory: 2GB
您能否指出我正确的方向,我应该看什么才能解决这个问题。
感谢您的帮助!
【问题讨论】:
2 GB 对于服务器系统来说似乎很低,我建议至少获得 8 GB。尝试将 Java 参数 -Xms 和 -Xmx 设置为至少 1 GB。和往常一样检查你的代码,看看你是否忘记清理东西。 请将常用的jar文件移动到tomcat的lib文件夹中 @Davio “2GB 对于服务器系统来说似乎很低”是一个毫无意义的短语。它真的取决于服务器的类型,当然还有负载。我的服务器运行良好,512Mb 或更少,而其他服务器需要 128Gb。 通常会在不知道为什么达到顶部的情况下放置更多内存,只是掩盖内部问题。我建议您分析您的内存并尝试找出服务器资源在哪里(以及为什么,也许只是需要,根本没有糟糕的编程),或者为什么它们在使用后没有正确释放。 如果应用程序内存不断增加,它可能在某些时候出现内存泄漏,就像 exoddus 所说的那样。值得花一些时间来分析它。 【参考方案1】:当您的 JVM 耗尽特定资源时,将发生 java.lang.OutOfMemoryError: Java heap space
错误。
解决方案 1:您应该增加该资源的可用性。当您的应用程序没有足够的 Java 堆空间内存来正常运行时。为此,您需要更改 JVM 启动配置并添加以下内容:-Xmx1024m
上述配置将为应用程序提供 1024MB 的 Java 堆空间。您可以使用 g 或 G 表示 GB,m 或 M 表示 MB,k 或 K 表示 KB。例如以下所有内容都相当于说最大Java堆空间为1GB:
-Xmx1073741824
-Xmx1048576k
-Xmx1024m
-Xmx1g
解决方案 2:如果您的应用程序包含 内存泄漏,添加更多堆只会推迟 java.lang.OutOfMemoryError: Java heap space 错误。 如果您希望解决 Java 堆空间的根本问题而不是掩盖症状,那么您可以使用多种工具。 例如:Plumbr 工具。在其他性能问题中,它会捕获所有 java.lang.OutOfMemoryErrors 并自动告诉您导致它们的原因。您可以浏览其他可用工具。选择权在你!来源:https://plumbr.eu/outofmemoryerror/java-heap-space
【讨论】:
只发布链接不是一个好主意。将来可能会改变。而是解释并使用链接作为支持。【参考方案2】:可能有几个原因,
由于您没有增加默认内存分配,在高负载的情况下,它可能没有足够的资源来处理所有请求,并且有些显然内存不足。所以首先要尝试的是调整 jvm 内存配置。
如果 1 不起作用,则可能是您的应用程序中存在阻止垃圾收集的错误。您可能希望使用附加的分析器运行您的应用程序,以查看随着时间的推移收集了哪些对象并使用该信息进行调试。
【讨论】:
以上是关于Tomcat7 java.lang.OutOfMemoryError:Java 堆空间的主要内容,如果未能解决你的问题,请参考以下文章