今天性能测试时用Jconsole监控JVM内存情况(在JVM参数中添加:-Dcom.sun.management.jmxremote.port=1100 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=10.20.153.252),发现应用在跑了一段时间之后,Full GC越来越频繁,而且每次Full GC都无法完全回收内存,不可回收的内存对象越来越多,如下图所示:
于是用jmap查了查,发现[Ljava.lang.Object; [C; java.util.concurrent.ConcurrentHashMap$HashEntry; java.lang.String; java.util.ArrayList这5类对象数目不断增加,占用的内存越来越多,Full GC无法回收这些对象,如果一直这样压下去,肯定会发现内存泄漏~~~~
压到最后发生out of memory,虽然应用还没有挂,但大多数请求都TimeOut,偶尔有一小部分请求仍能成功,
Timeout错误:
- ERROR 09/28, 09:44:17 db.common.util.HttpInvokerUtil access url[http://10.20.136.20/api/person/profile/CN/z6789430] error: param=null
- java.net.SocketTimeoutException: Read timed out
- at java.net.SocketInputStream.socketRead0(Native Method)
- at java.net.SocketInputStream.read(SocketInputStream.java:129)
- at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
- at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
- at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
- at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:687)
- at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:632)
- at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1072)
- at com.alibaba.udb.common.util.HttpInvokerUtil.invoke(HttpInvokerUtil.java:130)
- at com.alibaba.udb.client.BaseServiceClient.invoke(BaseServiceClient.java:92)
- at com.alibaba.udb.client.BaseServiceClient.invoke(BaseServiceClient.java:70)
- at com.alibaba.udb.client.PersonServiceClientImpl.getPersonProfileByLongId(PersonServiceClientImpl.java:93)
- at com.alibaba.udb.perf.TestMem.testMem(TestMem.java:69)
- at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
- at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
- at java.lang.reflect.Method.invoke(Method.java:597)
- at com.alibaba.udb.perf.AbstractServiceClient.invokeTest(AbstractServiceClient.java:37)
- at com.alibaba.udb.perf.TestMem.runTest(TestMem.java:94)
- at org.apache.jmeter.protocol.java.sampler.JavaSampler.sample(JavaSampler.java:161)
- at org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:346)
- at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:243)
- at java.lang.Thread.run(Thread.java:619)
- ERROR 09/28, 09:44:17 a.udb.client.BaseServiceClient java.net.SocketTimeoutException: Read timed out
- java.lang.RuntimeException: java.net.SocketTimeoutException: Read timed out
- at com.alibaba.udb.common.util.HttpInvokerUtil.invoke(HttpInvokerUtil.java:142)
- at com.alibaba.udb.client.BaseServiceClient.invoke(BaseServiceClient.java:92)
- at com.alibaba.udb.client.BaseServiceClient.invoke(BaseServiceClient.java:70)
- at com.alibaba.udb.client.PersonServiceClientImpl.getPersonProfileByLongId(PersonServiceClientImpl.java:93)
- at com.alibaba.udb.perf.TestMem.testMem(TestMem.java:69)
- at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
- at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
- at java.lang.reflect.Method.invoke(Method.java:597)
- at com.alibaba.udb.perf.AbstractServiceClient.invokeTest(AbstractServiceClient.java:37)
- at com.alibaba.udb.perf.TestMem.runTest(TestMem.java:94)
- at org.apache.jmeter.protocol.java.sampler.JavaSampler.sample(JavaSampler.java:161)
- at org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:346)
- at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:243)
- at java.lang.Thread.run(Thread.java:619)
- Caused by: java.net.SocketTimeoutException: Read timed out
- at java.net.SocketInputStream.socketRead0(Native Method)
- at java.net.SocketInputStream.read(SocketInputStream.java:129)
- at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
- at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
- at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
- at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:687)
- at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:632)
- at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1072)
- at com.alibaba.udb.common.util.HttpInvokerUtil.invoke(HttpInvokerUtil.java:130)
- ... 13 more
此时的JVM情况:
jmap情况:
Jboss报异常:
- 21:43:11,947 WARN [MsgContext] Error sending end packet
- java.net.SocketException: Broken pipe
- at java.net.SocketOutputStream.socketWrite0(Native Method)
- at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
- at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
- at org.apache.jk.common.ChannelSocket.send(ChannelSocket.java:531)
- at org.apache.jk.common.JkInputStream.endMessage(JkInputStream.java:112)
- at org.apache.jk.core.MsgContext.action(MsgContext.java:293)
- at org.apache.coyote.Response.action(Response.java:182)
- at org.apache.coyote.Response.finish(Response.java:304)
- at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:204)
- at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:282)
- at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:767)
- at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:697)
- at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:889)
- at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
- at java.lang.Thread.run(Thread.java:619)
- 21:43:11,948 WARN [ChannelSocket] processCallbacks status 2
- 21:51:51,251 ERROR [STDERR] Exception in thread "InactivityMonitor Async Task: java.util.concurrent.ThreadPoolExecutor$Worker@23574efe"
- 21:51:51,251 ERROR [STDERR] java.util.concurrent.RejectedExecutionException