检测内存泄漏

关键字:  内存泄漏 , jmap , jconsole

今天性能测试时用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都无法完全回收内存,不可回收的内存对象越来越多,如下图所示:

检测内存泄漏_第1张图片

于是用jmap查了查,发现[Ljava.lang.Object; [C; java.util.concurrent.ConcurrentHashMap$HashEntry; java.lang.String; java.util.ArrayList这5类对象数目不断增加,占用的内存越来越多,Full GC无法回收这些对象,如果一直这样压下去,肯定会发现内存泄漏~~~~

检测内存泄漏_第2张图片

压到最后发生out of memory,虽然应用还没有挂,但大多数请求都TimeOut,偶尔有一小部分请求仍能成功,

Timeout错误:

  1. ERROR 09/2809:44:17 db.common.util.HttpInvokerUtil access url[http://10.20.136.20/api/person/profile/CN/z6789430] error: param=null  
  2. java.net.SocketTimeoutException: Read timed out  
  3.     at java.net.SocketInputStream.socketRead0(Native Method)  
  4.     at java.net.SocketInputStream.read(SocketInputStream.java:129)  
  5.     at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)  
  6.     at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)  
  7.     at java.io.BufferedInputStream.read(BufferedInputStream.java:317)  
  8.     at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:687)  
  9.     at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:632)  
  10.     at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1072)  
  11.     at com.alibaba.udb.common.util.HttpInvokerUtil.invoke(HttpInvokerUtil.java:130)  
  12.     at com.alibaba.udb.client.BaseServiceClient.invoke(BaseServiceClient.java:92)  
  13.     at com.alibaba.udb.client.BaseServiceClient.invoke(BaseServiceClient.java:70)  
  14.     at com.alibaba.udb.client.PersonServiceClientImpl.getPersonProfileByLongId(PersonServiceClientImpl.java:93)  
  15.     at com.alibaba.udb.perf.TestMem.testMem(TestMem.java:69)  
  16.     at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)  
  17.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  
  18.     at java.lang.reflect.Method.invoke(Method.java:597)  
  19.     at com.alibaba.udb.perf.AbstractServiceClient.invokeTest(AbstractServiceClient.java:37)  
  20.     at com.alibaba.udb.perf.TestMem.runTest(TestMem.java:94)  
  21.     at org.apache.jmeter.protocol.java.sampler.JavaSampler.sample(JavaSampler.java:161)  
  22.     at org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:346)  
  23.     at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:243)  
  24.     at java.lang.Thread.run(Thread.java:619)  
  25. ERROR 09/2809:44:17 a.udb.client.BaseServiceClient java.net.SocketTimeoutException: Read timed out  
  26. java.lang.RuntimeException: java.net.SocketTimeoutException: Read timed out  
  27.     at com.alibaba.udb.common.util.HttpInvokerUtil.invoke(HttpInvokerUtil.java:142)  
  28.     at com.alibaba.udb.client.BaseServiceClient.invoke(BaseServiceClient.java:92)  
  29.     at com.alibaba.udb.client.BaseServiceClient.invoke(BaseServiceClient.java:70)  
  30.     at com.alibaba.udb.client.PersonServiceClientImpl.getPersonProfileByLongId(PersonServiceClientImpl.java:93)  
  31.     at com.alibaba.udb.perf.TestMem.testMem(TestMem.java:69)  
  32.     at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)  
  33.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  
  34.     at java.lang.reflect.Method.invoke(Method.java:597)  
  35.     at com.alibaba.udb.perf.AbstractServiceClient.invokeTest(AbstractServiceClient.java:37)  
  36.     at com.alibaba.udb.perf.TestMem.runTest(TestMem.java:94)  
  37.     at org.apache.jmeter.protocol.java.sampler.JavaSampler.sample(JavaSampler.java:161)  
  38.     at org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:346)  
  39.     at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:243)  
  40.     at java.lang.Thread.run(Thread.java:619)  
  41. Caused by: java.net.SocketTimeoutException: Read timed out  
  42.     at java.net.SocketInputStream.socketRead0(Native Method)  
  43.     at java.net.SocketInputStream.read(SocketInputStream.java:129)  
  44.     at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)  
  45.     at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)  
  46.     at java.io.BufferedInputStream.read(BufferedInputStream.java:317)  
  47.     at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:687)  
  48.     at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:632)  
  49.     at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1072)  
  50.     at com.alibaba.udb.common.util.HttpInvokerUtil.invoke(HttpInvokerUtil.java:130)  
  51.     ... 13 more  

此时的JVM情况:

检测内存泄漏_第3张图片

jmap情况:

检测内存泄漏_第4张图片

Jboss报异常:

  1. 21:43:11,947 WARN  [MsgContext] Error sending end packet  
  2. java.net.SocketException: Broken pipe  
  3.     at java.net.SocketOutputStream.socketWrite0(Native Method)  
  4.     at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)  
  5.     at java.net.SocketOutputStream.write(SocketOutputStream.java:136)  
  6.     at org.apache.jk.common.ChannelSocket.send(ChannelSocket.java:531)  
  7.     at org.apache.jk.common.JkInputStream.endMessage(JkInputStream.java:112)  
  8.     at org.apache.jk.core.MsgContext.action(MsgContext.java:293)  
  9.     at org.apache.coyote.Response.action(Response.java:182)  
  10.     at org.apache.coyote.Response.finish(Response.java:304)  
  11.     at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:204)  
  12.     at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:282)  
  13.     at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:767)  
  14.     at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:697)  
  15.     at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:889)  
  16.     at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)  
  17.     at java.lang.Thread.run(Thread.java:619)  
  18. 21:43:11,948 WARN  [ChannelSocket] processCallbacks status 2  
  19. 21:51:51,251 ERROR [STDERR] Exception in thread "InactivityMonitor Async Task: java.util.concurrent.ThreadPoolExecutor$Worker@23574efe"   
  20. 21:51:51,251 ERROR [STDERR] java.util.concurrent.RejectedExecutionException  
  21. color: black; background-color: inhe
分享到:
评论

你可能感兴趣的:(java,apache,jvm,.net,sun)