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

Java进程的内存无限增长,但MemoryMXBean报告稳定的堆和非堆大小

谢志文
2023-03-14

我们有一个问题,即java进程使用的内存无限增长,直到Linux最终杀死java进程。

我们的堆内存是健康稳定的。(我们已经广泛地分析了堆)我们还使用MemoryMXBean来监视应用程序的非堆内存使用情况,因为我们认为问题可能就在那里。然而,我们看到的是报告的堆大小+报告的非堆大小保持稳定。

下面是一个示例,说明了在我们的目标系统上使用1GB RAM运行应用程序时,数字可能会是什么样子(由MemoryMXBean报告堆和非堆,使用Linux的top命令(驻留内存)监视Java进程使用的总内存):

    null
    null
  • 200 MB堆提交
  • 40 MB未提交堆
  • 400 MB由java进程使用

上面的数字只是我们系统表现的一个“更干净”的表示,但它们相当准确和接近现实。正如你所看到的,趋势是明确的。运行应用程序几周后,Linux系统开始出现问题,因为系统内存不足。事情开始变慢了。再过几个小时,Java进程就结束了。

经过几个月的分析和试图理解这一点,我们仍然不知所措。我觉得很难找到关于这个问题的信息,因为大多数讨论最后都是解释堆或其他非堆内存池。(如Metaspace等)

如何监视/配置此内存?对于我们来说,堆+非堆之外的一切都有点像黑盒。

任何帮助都将不胜感激。

共有1个答案

童华池
2023-03-14

我试着部分回答你的问题。

在这种情况下,我试图坚持的基本策略是监视每个可用内存池、打开的文件、套接字、缓冲池、线程数等的max/used/peak值。

在您的例子中,看起来您确实有一个本地内存泄漏的问题,这个问题非常严重,很难发现。

# jcmd <pid> VM.native_memory baseline
# jcmd <pid> VM.native_memory summary.diff scale=MB

Total:  reserved=664624KB  -20610KB, committed=254344KB -20610KB
...
 类似资料:
  • 问题描述:我们在一个web应用程序(在CQ5上)中面临以下问题: 系统配置详细信息:系统内存: 7GB Xmx: 3.5 GB Xms: 1 GB MaxPermGen: 300MB最大观察线程数: 620(包括300个超文本传输协议请求服务线程)Xss:默认值 问题是cq5 java进程(运行servlet引擎)消耗的内存随着时间的推移而不断增加。一旦达到6到6.5GB以上(系统内存达到7GB)

  • 我们有一个在Solaris 10上运行的java进程,为大约200-300个并发用户提供服务。管理员报告说,随着时间的推移,进程使用的内存显著增加。几天内它就达到2GB,并且从未停止增长。 我们已经转储了堆,并使用Eclipse内存探查器对其进行了分析,但没有看到任何异常。堆的大小非常小。 在添加内存统计日志记录后,我们在应用程序中发现管理员使用的“top”实用程序报告的内存使用量与MemoryM

  • 本文向大家介绍eclipse 增加Eclipse的最大堆内存,包括了eclipse 增加Eclipse的最大堆内存的使用技巧和注意事项,需要的朋友参考一下 示例 要增加Eclipse使用的最大堆内存量,请编辑eclipse.iniEclipse安装目录中的文件。 该文件指定用于启动Eclipse的选项,例如要使用的JVM,以及JVM的选项。具体来说,您需要编辑-XmxJVM选项的值(如果不存在,请

  • 在Java中分配堆外内存时(例如通过直接缓冲区或JNI本机代码),如果JVM使用-XX: UseLargePages,分配的内存是否会由巨大的页面支持?

  • PS:有时我会从java代码执行shell脚本。会不会导致这类问题?

  • 我使用的是64位Ubuntu和java VM64位版本。 我有8GB内存。 我无法将java堆大小更改为4096M,甚至2048M也不行。 我试过这些东西: 产出: x86_64 OpenJDK 64位服务器VM(构建11.0.4+11-post-ubuntu-1ubuntu218.04.3,混合模式,共享) 当我试图更改堆大小时: 输出