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

java.lang.OutOfMemoryError:tomcat中超出了GC开销限制,java,tomcat,garbage-collection,jersey,jersey-2.0,Java,Tomcat,Garbage Collection,Jersey,Jersey 2.0,我有一个Tomcat8实例,在windows机器上只运行jersey web服务应用程序。一段时间后(可能是数小时或数天),tomcat崩溃,留下以下日志: 看起来错误发生在web服务中,因为我可以在堆栈跟踪中看到org.glassfish.jersey 但我不知道这到底是为什么,也不知道发生在哪里。也许我的一些服务消耗了很多内存,但我不知道是哪一个 是否有一种方法可以运行一些诊断以准确检测此错误的原因 11-Apr-2015 10:27:09.154 INFO [http-apr-8080-e

我有一个Tomcat8实例,在windows机器上只运行jersey web服务应用程序。一段时间后(可能是数小时或数天),tomcat崩溃,留下以下日志:

看起来错误发生在web服务中,因为我可以在堆栈跟踪中看到
org.glassfish.jersey

但我不知道这到底是为什么,也不知道发生在哪里。也许我的一些服务消耗了很多内存,但我不知道是哪一个

是否有一种方法可以运行一些诊断以准确检测此错误的原因

11-Apr-2015 10:27:09.154 INFO [http-apr-8080-exec-3] org.glassfish.jersey.server.ApplicationHandler.initialize Initiating Jersey application, version Jersey: 2.0 2013-05-14 20:07:34...
11-Apr-2015 19:20:59.447 WARNING [http-apr-8080-exec-5] null.null Attempt to release single request processing resources has failed.
 java.lang.OutOfMemoryError: GC overhead limit exceeded
    at java.util.LinkedHashMap$LinkedKeySet.iterator(LinkedHashMap.java:539)
    at java.util.HashSet.iterator(HashSet.java:172)
    at org.glassfish.hk2.utilities.DescriptorImpl.hashCode(DescriptorImpl.java:481)
    at org.jvnet.hk2.internal.SystemDescriptor.hashCode(SystemDescriptor.java:729)
    at java.util.HashMap.hash(HashMap.java:338)
    at java.util.HashMap.get(HashMap.java:556)
    at org.glassfish.jersey.process.internal.RequestScope$Instance.put(RequestScope.java:491)
    at org.glassfish.jersey.process.internal.RequestScope.findOrCreate(RequestScope.java:158)
    at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2203)
    at org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:579)
    at org.jvnet.hk2.internal.IterableProviderImpl.get(IterableProviderImpl.java:87)
    at org.glassfish.jersey.server.ServerRuntime$Responder.release(ServerRuntime.java:539)
    at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:324)
    at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:227)
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
    at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:198)
    at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:946)
    at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:323)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:372)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:335)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:218)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)

11-Apr-2015 19:22:09.935 SEVERE [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run Unexpected death of background thread ContainerBackgroundProcessor[StandardEngine[Catalina]]
 java.lang.OutOfMemoryError: GC overhead limit exceeded

使用jmap dump并尝试将占用大量内存的实例映射到您的代码gc花费的时间太长。这可能是因为交换。JVM进程使用的内存是否比实际可用内存多?@Thorbjørnravandersen GC overhead并不意味着GC花费的时间太长。这意味着JVM花费了太多的GCing时间,这可能是由于内存增长到了允许的最大限制。@JohnVint是什么触发了异常?花费的时间太长,收益太少。那么如何查看JVM正在进行垃圾收集呢?我的意思是,我能看看它收集的什么东西让它花费太长时间吗?