我正在使用 Red Hat tomcat7 容器(与 docker hub 上的 tomcat7 非常相似):
registry.access.redhat.com/jboss-webserver-3/webserver30-tomcat7-openshift:1.2-12
我在其中部署了一些 .wars,但在执行大量过程后,我收到以下错误:
GC overhead limit exceeded
java.lang.OutOfMemoryError: GC overhead limit exceeded
所以我想研究最大堆大小和其他内存设置:
命令:
java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
Output:
Picked up JAVA_TOOL_OPTIONS: -Duser.home=/home/jboss -Duser.name=jboss
intx CompilerThreadStackSize = 0
{pd product}
uintx ErgoHeapSizeLimit = 0
{product}
uintx HeapSizePerGCThread = 87241520
{product}
uintx InitialHeapSize = 125829120
{product}
uintx LargePageHeapSizeThreshold = 134217728
{product}
uintx MaxHeapSize = 1983905792
{product}
intx ThreadStackSize = 1024
{pd product}
intx VMThreadStackSize = 1024
{pd product}
openjdk version "1.8.0_91"
OpenJDK Runtime Environment (build 1.8.0_91-b14)
OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)
我不知道如何解释这些信息。 我考虑过增加堆大小。
- pd 产品或产品是什么意思?
- 最大堆大小 = java 或您的应用程序或整个 tomcat 的最大内存消耗吗?因为经过一番调查,我发现容器在出现
内存不足
问题时使用的内存远多于 1892 MB(19839...)。
最佳答案
Tomcat 应该为所有应用程序使用单个 JVM。这确实使用了 1892 MB ( 1983905792 B/10242 ),这里的问题可能是:
- 您存在内存泄漏 - 您保留了对正在使用的对象的引用,它们导致您的虚拟机无法通过垃圾回收释放内存。解释得更好here 。
尝试通过查看
jmap -histo <javaPID>
的输出来找出发生这种情况的原因。 - 您的应用运行正常,您确实需要更多堆内存。您可以通过设置
set CATALINA_OPTS= -Xmx2g
来增加内存。
关于java - Red Hat Tomcat 7容器上java的Heapsize等内存配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37045110/