简体   繁体   English

Tomcat java.lang.OutOfMemoryError:超出了GC开销限制

[英]Tomcat java.lang.OutOfMemoryError: GC overhead limit exceeded

We trying to migrate our application to Tomcat 7.0 from OC4J. 我们尝试将我们的应用程序从OC4J迁移到Tomcat 7.0。 The application works fine with OC4J but, in tomcat the performance gets affected when running load testing with 10 users. 该应用程序适用于OC4J,但在tomcat中,当运行10个用户的负载测试时,性能会受到影响。 We get these errors and the application doesnt respond anymore. 我们得到这些错误,应用程序不再响应。

---java.lang.OutOfMemoryError: GC overhead limit exceeded 

Exception in thread "ajp-bio-8009-exec-231" java.lang.OutOfMemoryError: GC overhead limit exceeded 
Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" java.lang.OutOfMemoryError: GC overhead limit exceeded 

Exception in thread "ajp-bio-8009-exec-236" java.lang.OutOfMemoryError: GC overhead limit exceeded 
Exception in thread "ajp-bio-8009-exec-208" java.lang.OutOfMemoryError: GC overhead limit exceeded 
java.lang.OutOfMemoryError: GC overhead limit exceeded 

java.lang.OutOfMemoryError: GC overhead limit exceeded 

Exception in thread "Thread-33" java.lang.OutOfMemoryError: GC overhead limit exceeded 

Exception in thread "ajp-bio-8009-exec-258" java.lang.OutOfMemoryError: GC overhead limit exceeded 

java.lang.OutOfMemoryError: GC overhead limit exceeded

We tried JAVA_OPTS="-Xms4096m -Xmx8192m . Looks like we still get the error. Please suggest the possible options that we could try.. 我们尝试了JAVA_OPTS="-Xms4096m -Xmx8192m 。看起来我们仍然得到错误。请建议我们可以尝试的可能选项..

Garbage collection logs 垃圾收集日志

GC invocations=593 (full 539): PSYoungGen total 701120K, used 374720K [0x00000007aaab0000, 0x00000007eaf60000, 0x0000000800000000) eden space 374720K, 100% used [0x00000007aaab0000,0x00000007c18a0000,0x00000007c18a0000) from space 326400K, 0% used [0x00000007d70a0000,0x00000007d70a0000,0x00000007eaf60000) to space 339328K, 0% used [0x00000007c18a0000,0x00000007c18a0000,0x00000007d6400000) ParOldGen total 2796224K, used 2796223K [0x0000000700000000, 0x00000007aaab0000, 0x00000007aaab0000) object space 2796224K, 99% used [0x0000000700000000,0x00000007aaaaffe8,0x00000007aaab0000) PSPermGen total 50688K, used 50628K [0x00000006fae00000, 0x00000006fdf80000, 0x0000000700000000) object space 50688K, 99% used [0x00000006fae00000,0x00000006fdf713a8,0x00000006fdf80000) 4482.450: [Full GC [PSYoungGen: 374720K->339611K(701120K)] [ParOldGen: 2796223K->2796222K(2796224K)] 3170943K->3135834K(3497344K) [PSPermGen: 50628K->50628K(50688K)], 1.4852620 secs] GC调用= 593(完整539):PSYoungGen总计701120K,使用374720K [0x00000007aaab0000,0x00000007eaf60000,0x0000000800000000] eden space 374720K,100%使用[0x00000007aaab0000,0x00000007c18a0000,0x00000007c18a0000]来自空间326400K,0%使用[0x00000007d70a0000,0x00000007d70a0000,0x00000007eaf60000)到空间339328K,0%使用[0x00000007c18a0000,0x00000007c18a0000,0x00000007d6400000] ParOldGen总计2796224K,使用2796223K [0x0000000700000000,0x00000007aaab0000,0x00000007aaab0000]对象空间2796224K,99%使用[0x0000000700000000,0x00000007aaaaffe8,0x00000007aaab0000] PSPermGen总计50688K,使用50628K [0x00000006fae00000, 0x00000006fdf80000,0x0000000700000000)对象空间50688K,99%使用[0x00000006fae00000,0x00000006fdf713a8,0x00000006fdf80000] 4482.450:[Full GC [PSYoungGen:374720K-> 339611K(701120K)] [ParOldGen:2796223K-> 2796222K(2796224K)] 3170943K-> 3135834K( 3497344K)[PSPermGen:50628K-> 50628K(50688K)],1.4852620 secs]

GC Overrhead Limit exceeded usually implies the application is 'leaking' memory some where. GC Overrhead Limit exceeded通常意味着应用程序在某些地方'泄漏'内存。 Your heap is high in memory use, like 98/99% and a full GC will retrieve maybe a percent or two. 你的堆内存使用率很高,比如98/99%,一个完整的GC可以检索一两个百分点。 What that will do is it will spend most of the time GCing. 它将做的是它将花费大部分时间GCing。 The JVM checks to see how often it has spent GCing and if it exceeds some limit this error is what is thrown. JVM检查它是否经常使用GCing,如果它超过某个限制,则会抛出此错误。

To resolve it you will need to check where the leak is occurring. 要解决此问题,您需要检查泄漏发生的位置。 Do this by getting a heap dump. 通过获取堆转储来执行此操作。 You can use jmap for that. 你可以使用jmap。 Once you get it, you should see the % of the heap will probably belong mostly to one set of objects 一旦得到它,你应该看到堆的百分比可能主要属于一组对象

We tried JAVA_OPTS="-Xms4096m -Xmx8192m. Looks like we still get the error. Please suggest the possible options that we could try.. 我们尝试了JAVA_OPTS =“ - Xms4096m -Xmx8192m。看起来我们仍然得到错误。请建议我们可以尝试的可能选项..

That's a lot and only delays the inevitable. 这是很多,只会延迟不可避免的事情。


Edit from you update 从您的编辑更新

As I expected your OldGen space is at 99% with little reclaimed. 正如我所料,你的OldGen空间是99%,几乎没有回收。 OldGen space is where all long lived object will be placed. OldGen空间是放置所有长寿命对象的地方。 Since you are not reclaiming some memory all of those objects will eventually be placed into OldGen and you will run out of memory. 由于您没有回收某些内存,所有这些对象最终将被放入OldGen中,并且您将耗尽内存。

What's worth reading are the two lines here: 值得一读的是这两条线:

ParOldGen total 2796224K, used 2796223K [0x0000000700000000, 0x00000007aaab0000, 0x00000007aaab0000) object space 2796224K, 99% 

Full GC [PSYoungGen: 374720K->339611K(701120K)] [ParOldGen: 2796223K->2796222K(2796224K)] 3170943K->3135834K(3497344K) 

Like I mentioned, OldGen is at 99% and a Full GC only reclaims 1KB YounGen and 35KB OldGen . 就像我提到的那样,OldGen是99%而Full GC只收回1KB YounGen35KB OldGen It will have to GC almost immediately again. 几乎立刻就要GC了。 It should be GCing GBs at this point. 此时应该是GCing GB。

So 所以

Get a heap dump and find out what the greatest offender here is. 获取堆转储并找出这里最伟大的罪犯是什么。 Investigate where these objects are being created and why they are not becoming unreachable. 调查这些对象的创建位置以及它们无法到达的原因。

If you have any other questions about how/where or why let me know, but there is nothing else I can tell you at this point. 如果您有关于如何/在何处或为何让我知道的任何其他问题,但此时我无法告诉您。

The detail message "GC overhead limit exceeded" indicates that the garbage collector is running all the time and Java program is making very slow progress. 详细消息“超出GC开销限制”表示垃圾收集器一直在运行,Java程序进展非常缓慢。

Can be fixed in 2 ways 1) By Suppressing GC Overhead limit warning in JVM parameter Ex- -Xms1024M -Xmx2048M -XX:+UseConcMarkSweepGC -XX:-UseGCOverheadLimit 可以通过两种方式修复1)通过抑制JVM参数中的GC开销限制警告Ex- -Xms1024M -Xmx2048M -XX:+ UseConcMarkSweepGC -XX:-UseGCOverheadLimit

-UseGCOverheadLimit - Parameter is used to suppress GCOverHead. -UseGCOverheadLimit - 参数用于抑制GCOverHead。

2) By identifying memory leak 2)通过识别内存泄漏

What is your permsize ? 你的permsize是什么? Can you increase it to say 512m 你可以把它增加到512米

-XX:MaxPermSize=512m

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Java PreparedStatement java.lang.OutOfMemoryError:超出了GC开销限制 - Java PreparedStatement java.lang.OutOfMemoryError: GC overhead limit exceeded 詹金斯 java.lang.OutOfMemoryError:超出 GC 开销限制 - Jenkins java.lang.OutOfMemoryError: GC overhead limit exceeded java.lang.OutOfMemoryError:GC开销限制超出了android studio - java.lang.OutOfMemoryError: GC overhead limit exceeded android studio Gridgain:java.lang.OutOfMemoryError:超出了GC开销限制 - Gridgain: java.lang.OutOfMemoryError: GC overhead limit exceeded Spark失败了java.lang.OutOfMemoryError:超出了GC开销限制? - Spark fails with java.lang.OutOfMemoryError: GC overhead limit exceeded? SonarQube java.lang.OutOfMemoryError:超出了GC开销限制 - SonarQube java.lang.OutOfMemoryError: GC overhead limit exceeded java.lang.OutOfMemoryError:超出 GC 开销限制 - java.lang.OutOfMemoryError: GC overhead limit exceeded 超出Junit java.lang.OutOfMemoryError GC开销限制 - Junit java.lang.OutOfMemoryError GC overhead limit exceeded 获取错误:java.lang.OutOfMemoryError:超出了GC开销限制 - Getting Error:java.lang.OutOfMemoryError: GC overhead limit exceeded 获取java.lang.OutOfMemoryError:Jboss中超出了GC开销限制 - Getting java.lang.OutOfMemoryError: GC overhead limit exceeded in Jboss
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM