当前位置: 首页 > 知识库问答 >
问题:

如何在JVM上调试本机内存泄漏?

西门鹏程
2023-03-14

我们有一个运行在Mule上的java应用程序。我们将XMX值配置为6144M,但总的内存使用量却在不断攀升。前几天,在我们主动重启它之前,它已经接近20 GB了。

Thu Jun 30 03:05:57 CDT 2016
top - 03:05:58 up 149 days,  6:19,  0 users,  load average: 0.04, 0.04, 0.00
Tasks: 164 total,   1 running, 163 sleeping,   0 stopped,   0 zombie
Cpu(s):  4.2%us,  1.7%sy,  0.0%ni, 93.9%id,  0.2%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  24600552k total, 21654876k used,  2945676k free,   440828k buffers
Swap:  2097144k total,    84256k used,  2012888k free,  1047316k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 3840 myuser  20   0 23.9g  18g  53m S  0.0 79.9 375:30.02 java

jps命令显示:

10671 Jps
3840 MuleContainerBootstrap

jstat命令显示:

 S0C    S1C    S0U    S1U      EC       EU        OC         OU       PC     PU    YGC     YGCT    FGC    FGCT     GCT
37376.0 36864.0 16160.0  0.0   2022912.0 1941418.4 4194304.0   445432.2  78336.0 66776.7    232    7.044  17     17.403   24.447
3840 MuleContainerBootstrap -Dmule.home=/mule -Dmule.base=/mule -Djava.net.preferIPv4Stack=TRUE -XX:MaxPermSize=256m -Djava.endorsed.dirs=/mule/lib/endorsed -XX:+HeapDumpOnOutOfMemoryError -Dmyapp.lib.path=/datalake/app/ext_lib/ -DTARGET_ENV=prod -Djava.library.path=/opt/mapr/lib -DksPass=mypass -DsecretKey=aeskey -DencryptMode=AES -Dkeystore=/mule/myStore -DkeystoreInstance=JCEKS -Djava.security.auth.login.config=/opt/mapr/conf/mapr.login.conf -Dmule.mmc.bind.port=1521 -Xms6144m -Xmx6144m -Djava.library.path=%LD_LIBRARY_PATH%:/mule/lib/boot -Dwrapper.key=a_guid -Dwrapper.port=32000 -Dwrapper.jvm.port.min=31000 -Dwrapper.jvm.port.max=31999 -Dwrapper.disable_console_input=TRUE -Dwrapper.pid=10744 -Dwrapper.version=3.5.19-st -Dwrapper.native_library=wrapper -Dwrapper.arch=x86 -Dwrapper.service=TRUE -Dwrapper.cpu.timeout=10 -Dwrapper.jvmid=1 -Dwrapper.lang.domain=wrapper -Dwrapper.lang.folder=../lang
pmap 10746 > pmap_10746.txt
cat pmap_10746.txt | grep anon | cut -c18-25 | sort -h | uniq -c | sort -rn | less

Top 10 entries by count:
    119     12K
    112   1016K
     56      4K
     38 131072K
     20  65532K
     15 131068K
     14  65536K
     10    132K
      8  65404K
      7    128K


Top 10 entries by allocation size:
     1 6291456K
      1 205816K
      1 155648K
     38 131072K
     15 131068K
      1 108772K
      1  71680K
     14  65536K
     20  65532K
      1  65512K

And top 10 by total size:
Count   Size    Aggregate
1   6291456K    6291456K
38  131072K 4980736K
15  131068K 1966020K
20  65532K  1310640K
14  65536K  917504K
8   65404K  523232K
1   205816K 205816K
1   155648K 155648K
112 1016K   113792K

这似乎告诉我,因为Xmx和Xms被设置为相同的值,所以java堆只有一个6291456K的分配。其他分配不是java堆内存。它们是什么?它们被分配成相当大的块。

共有1个答案

夏侯林
2023-03-14

对彼得的回答进行了更详细的阐述。

您可以从VisualVM中进行二进制堆转储(右键单击左侧列表中的进程,然后单击heap dump,它将在下面显示)。如果不能将VisualVM附加到JVM,还可以使用以下命令生成转储:

jmap -dump:format=b,file=heap.hprof $PID

然后复制文件并用Visual VM打开它(文件、加载、选择类型堆转储、查找文件。)

注意底部窗格,我们有类型为Cleaner的“referent”和2“mybuffer”。这些属性将是其他类中引用我们钻进的DirectByteBuffer实例的属性(如果忽略Cleaner而关注其他类,这应该是可以的)。

从这一点上,您需要继续基于您的应用程序。

获取DBB实例列表的另一种等价方法是从OQL选项卡获取。此查询:

select x from java.nio.DirectByteBuffer x
select referrers(x) from java.nio.DirectByteBuffer x
 类似资料:
  • 我对部署在Tomcat中的Java应用程序有严重的问题: 操作系统:Debian 6.06(内核3.2.13-grsec-xxxx-grs-ipv6) Tomcat:6.0.35 JDK:1.60_37-b06 JVM params:-Xms3584m-Xmx3584m-XX: MaxPermsize=256m-XX: ThreadStacksize=1024 线程数:200 使用几个小时后,RS

  • 问题内容: 我有一个在django中运行的小型多线程脚本,随着时间的流逝,它开始使用越来越多的内存。将其保留一整天会消耗大约6GB的RAM,我开始进行交换。 在http://www.lshift.net/blog/2008/11/14/tracing-python-memory- leaks 之后,我将其视为最常见的类型(仅使用800M内存): 这没有什么奇怪的。我现在应该怎么做才能帮助调试内存问

  • 我在哪里可以找到libc_malloc_debug_leak。还有libc_malloc_debug_qemu。那么对于不同的Android版本(冰淇淋三明治、果冻豆、KitKat)和不同的设备(Galaxy Nexus、Nexus 7、Nexus 10)呢?

  • 问题内容: 有效的Java说: 内存泄漏的第三个常见来源是侦听器和其他回调。如果在客户端注册回调但未显式注销的情况下实现API,除非您采取某些措施,否则它们会累积。确保回调被及时垃圾回收的最佳方法是仅存储对其的弱引用,例如,通过仅将它们作为键存储在WeakHashMap中。 我是Java的初学者。有人可以教我如何在回调中创建弱引用,并告诉我它们如何解决内存泄漏问题吗?谢谢。 问题答案: 阅读这篇文

  • 在阅读了大量有关MAT的内容后,我使用我的生产堆转储来分析内存泄漏问题。下面是泄漏报告错误: 线程org.apache.tomcat.util.threads.taskthread@0x6d8be0a30 http-bio-8443-exec-115保留总大小为3,695,816,440(89.03%)字节的局部变量。 内存累积在“'<'System class Loader'>”加载的“java

  • 问题内容: 我们发生内存泄漏,这导致节点服务器的进程内存不足。有什么建议/工具可以帮助我们进行调试? 问题答案: 您是否正在运行最新最好的node.js v0.3.8? 但我相信您可以使用https://github.com/dannycoates/node- inspector 检测泄漏。