相关疑难解决方法(0)

内存完全由Java ConcurrentHashMap使用(在Tomcat下)

这是一个内存堆栈(作为高速缓存),其包含的只是一个静态的ConcurrentHashMap(CHM).

所有传入的HTTP请求数据都存储在此ConcurrentHashMap中.而且还有一个非同步调度过程中,从相同的ConcurrentHashMap取得数据,并将它们存储到数据库中后删除key.value.

该系统运行良好和平稳,但在以下条件才发现,内存得到了充分利用(2.5GB)和所有的CPU时间被送往执行GC:

-concurrent http命中1000/s

- 在15分钟内保持相同的并发命中

每次写入数据库时​​,异步进程都会记录CHM的剩余大小.CHM.size()保持在Min:300到Max:3500左右

我认为此应用程序存在内存泄漏.所以我使用Eclipse MAT来查看堆转储.运行可疑报告后,我从MAT获得了这些评论:

"org.apache.catalina.session.StandardManager" 通过 "org.apache.catalina.loader.StandardClassLoader @ 0x853f0280" 加载的一个实例占据2135429456(94.76%)字节.该存储器中的"$ java.util.concurrent.ConcurrentHashMap中段[]"通过""加载一个实例积累.

3,646,166 instances of java.util.concurrent.ConcurrentHashMap$Segment retain >= 2,135,429,456 bytes.
Run Code Online (Sandbox Code Playgroud)

Length    # Objects      Shallow Heap      Retained Heap 
0         3,646,166      482,015,968       >= 2,135,429,456 
Run Code Online (Sandbox Code Playgroud)

我将上面的长度0转换为CHM内的空长度记录(每次调用CHM.remove()方法).它与数据库内的记录数一致,创建此转储时,数据库中有3,646,166条记录

奇怪的情况是:如果我暂停压力测试,堆内存中的利用率将逐渐降至25MB.这需要大约30-45分钟.我重新模拟了这个应用程序,曲线看起来类似于下面的VisualVM图: 替代文字

继承人的问题:

1)这看起来像是内存泄漏吗?

2)每次删除调用remove(Object key, Object value)<key:value>从CHM中删除a ,删除的对象是否获得GC?

3)这与GC设置有关吗?我添加了以下GC参数但没有帮助:

-XX:+UseParallelGC

-XX:+UseParallelOldGC

-XX:GCTimeRatio=19

-XX:+PrintGCTimeStamps

-XX:ParallelGCThreads=6

-verbose:gc
Run Code Online (Sandbox Code Playgroud)

4)非常感谢任何解决这个问题的想法!:)

5)可能因为我的所有参考都是难以参考的吗?我的理解是,只要HTTP会话结束,所有那些非静态的变量现在都可用于GC.

注意我尝试用ehcache 2.2.0替换CHM,但是我遇到了相同的OutOfMemoryException问题.我想ehcache也在使用ConcurrentHashMap.

服务器规格:

-Xeon Quad内核,8个线程.

-4GB内存

-Windows 2008 R2

-Tomcat 6.0.29

java

16
推荐指数
3
解决办法
2万
查看次数

Tomcat崩溃并出现错误java.lang.OutOfMemoryError:超出了GC开销限制

tomcat运行几个月后,我意外地收到以下错误。我们重新启动了tomcat,该错误现在没有出现,但是将来可能会再次出现。我看到另一个用户有类似的异常,与垃圾回收相关,但与NIO连接器不完全相关。

有人知道为什么会发生这种情况吗,应该怎么做才能避免这种情况。

Jan 15, 2016 7:46:47 AM org.apache.tomcat.util.net.NioEndpoint$SocketProcessor run
SEVERE: 
java.lang.OutOfMemoryError: GC overhead limit exceeded
        at java.util.Collections.synchronizedSet(Collections.java:1691)
        at org.atmosphere.cpr.AtmosphereRequest$Builder.<init>(AtmosphereRequest.java:1146)
        at org.atmosphere.cpr.AtmosphereRequest.wrap(AtmosphereRequest.java:1891)
        at org.atmosphere.cpr.AtmosphereServlet.event(AtmosphereServlet.java:295)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilterEvent(ApplicationFilterChain.java:484)
        at org.apache.catalina.core.ApplicationFilterChain.doFilterEvent(ApplicationFilterChain.java:377)
        at org.apache.catalina.core.StandardWrapperValve.event(StandardWrapperValve.java:411)
        at org.apache.catalina.core.StandardContextValve.event(StandardContextValve.java:146)
        at org.apache.catalina.valves.ValveBase.event(ValveBase.java:224)
        at org.apache.catalina.core.StandardHostValve.event(StandardHostValve.java:256)
        at org.apache.catalina.valves.ValveBase.event(ValveBase.java:224)
        at org.apache.catalina.valves.ValveBase.event(ValveBase.java:224)
        at org.apache.catalina.core.StandardEngineValve.event(StandardEngineValve.java:138)
        at org.apache.catalina.connector.CoyoteAdapter.event(CoyoteAdapter.java:210)
        at org.apache.coyote.http11.Http11NioProcessor.event(Http11NioProcessor.java:124)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1690)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:744)
Run Code Online (Sandbox Code Playgroud)

java tomcat garbage-collection atmosphere

5
推荐指数
2
解决办法
1万
查看次数

标签 统计

java ×2

atmosphere ×1

garbage-collection ×1

tomcat ×1