`
flynewton
  • 浏览: 62611 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

检测内存泄漏

阅读更多

关键字: 内存泄漏 , 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都无法完全回收内存,不可回收的内存对象越来越多,如下图所示:

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

压到最后发生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情况:

jmap情况:

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
    分享到:
    评论

相关推荐

    linux下检查内存泄漏的工具+例子

    Valgrind的`memcheck`工具专门用于内存错误检测,`--leak-check=yes`则表示开启内存泄漏检查。 为了更好地理解Valgrind的用法,你可以参考提供的`demo`测试程序。这个演示程序可能会包含一些故意的内存泄漏,运行时...

    QT Creator内存泄露检测VLD

    windows下Qt creator 使用 VLD 工具的方法,下载 安装 使用 用浏览器打开

    c++检测内存泄漏(如何检测内存泄漏)

    4. **内存泄漏检测库**:有许多第三方库,如Valgrind、LeakSanitizer(ASan的一部分),可以帮助检测内存泄漏。这些工具可以在运行时检查程序的行为,报告未释放的内存块。 5. **内存泄漏检测算法**:除了工具,还...

    GDB查找内存泄露

    此外,除了GDB,还可以使用Valgrind、LeakSanitizer等工具进行更深入的内存泄漏检测。Valgrind提供了一整套内存错误检测工具,包括Memcheck,它能检测内存泄露、使用未初始化的内存和内存越界等问题。LeakSanitizer...

    vs2010内存泄露检查工具

    标题中的“vs2010内存泄露检查工具”指的是Visual Leak Detector(VLD),这是一个为Visual C++编译器设计的插件,它可以在运行时检测并报告C++程序中的内存泄漏情况。VLD能够集成到VS2010的环境中,使得开发者可以...

    使用Android Studio检测内存泄露(LeakCanary)

    在应用的Application类中安装LeakCanary,这样每当应用运行时,它就会自动检测内存泄露,并在检测到问题时通过通知栏提供详细的泄漏信息。点击通知可以直接查看泄漏的对象和引用链,极大地简化了内存泄露的诊断过程...

    C 语言检测内存泄露的方法(例子)

    本篇文章将详细讨论如何在C语言中检测内存泄漏,以及提供的示例代码。 首先,C语言的标准库并不直接提供检测内存泄漏的工具,因此我们需要借助一些额外的手段来实现。常见的方法包括: 1. **跟踪分配和释放**:...

    C++内存泄露检测器

    使用前,需要先解压"leakfinder.tar",然后按照工具的文档或指南进行配置和运行,以检查项目的内存泄漏情况。 总之,理解并有效利用内存泄漏检测器是C++开发中必不可少的技能,它能帮助我们编写更加健壮、高效的...

    检测内存泄漏的方法

    除了`_CrtDumpMemoryLeaks()`,还可以使用 `_CrtSetDbgFlag()` 来设置调试标志,例如 `_CRTDBG_ALLOC_MEM_DF` 开启内存分配调试,`_CRTDBG_LEAK_CHECK_DF` 在程序结束时自动检查内存泄漏。例如: ```cpp _...

    内存泄露检查工具

    3. Purify:Purify 是IBM开发的一款高级内存和线程错误检测工具,它能检测内存泄漏、双重释放、非法内存访问等问题。虽然Purify主要用于IBM AIX系统,但也有Windows和Linux版本。 4. Dr. Memory:Dr. Memory 是一款...

    Windows内存泄漏排查工具

    为了解决这个问题,开发者通常会使用专门的内存泄漏检测工具。本文将详细介绍两个用于Windows平台的内存泄漏排查工具:LeakDiag和LDGrapher。 **LeakDiag** LeakDiag是由微软开发的一款轻量级内存泄漏检测工具,...

    tcmalloc排查内存泄漏的方法

    tcmalloc是一种高性能的内存管理库,它可以帮助开发者检测和解决内存泄漏问题。在本文中,我们将介绍如何使用tcmalloc来排查内存泄漏的方法。 安装gperftools 首先,我们需要安装gperftools这个工具包,可以使用...

    【技术点之一】使用 CRT 调试功能来检测内存泄漏.rar_C++检测内存泄露的方法_ROO_YGR_泄漏

    "使用CRT调试功能来检测内存泄漏"是解决这一问题的重要技术点。CRT(C Run-Time Library)是C++标准库的一部分,它提供了丰富的调试工具,帮助开发者定位内存泄漏问题。 当程序不容易看出是否存在内存泄漏时,我们...

    使用 CRT 调试功能来检测内存泄漏

    除了手动调用`_CrtDumpMemoryLeaks`,还可以通过设置环境变量`_CRTDBG_DELAY_FREE_MEM_DF`来延迟释放内存,以便在程序运行过程中持续检查内存泄漏。这样做可以在程序执行多个步骤后查看泄漏情况,而不仅仅是程序结束...

    VC内存泄露检查 VC内存泄露检查 VC内存泄露检查

    开发者可以通过以下方式在代码层面检查内存泄露: - 使用`_CrtSetDbgFlag`设置调试标志,开启内存泄露检测。 - 使用`_RPTFQUICK`宏来报告每块内存的分配和释放情况。 - 手动跟踪和记录每个`new`操作对应的`...

    JProfiler检查内存泄漏

    下面将详细介绍JProfiler在检查内存泄漏方面的关键功能。 **内存剖析** 1. **对象统计与尺寸信息**:JProfiler能够展示堆上所有对象的类和包的统计信息,包括数量和大小。通过比较不同时间点的数据,可以发现内存...

    使用Visual Leak Detector检查内存泄露

    下面将详细介绍如何使用Visual Leak Detector来检查内存泄露。 首先,你需要下载并安装Visual Leak Detector。VLD作为一个静态库,需要将其集成到你的Visual Studio项目中。这通常包括以下步骤: 1. 下载VLD的最新...

    arm环境内存泄漏检测工具valgrind

    "arm环境内存泄漏检测工具valgrind"就是这样一个针对ARM平台的专业工具,它能帮助我们识别并解决内存泄漏问题。 Valgrind是一个开源的动态分析工具集,主要用于调试、性能评估和内存错误检测。在ARM环境下,...

Global site tag (gtag.js) - Google Analytics