【问题标题】:Java Process taking more and more memoryJava进程占用越来越多的内存
【发布时间】:2025-12-17 01:50:01
【问题描述】:

全部,

我有一个 Java 内存进程,随着时间的推移它开始占用越来越多的内存。为了设置堆空间使用上限,我将 -Xmx 选项设置为 512M。慢慢地过了一段时间Process内存占用达到了2GB。

我已经使用 MAT 和 YOURKIT 等各种工具分析了代码中可能存在的内存泄漏,并发现 Java 代码中没有这种可能的泄漏。该代码还使用了一个看起来无泄漏的 Native 函数。

我有以下问题:

  1. 是否可以对 Java 进程可以使用的总内存设置上限?
  2. 除了 Heap 之外,JVM 的其他内存使用情况是什么?
  3. Linux 是否在 Windows 的“工作集”内存模型上工作,其中进程在进入后台时会释放其内存。
  4. 即使在使用带有 512M 的 -Xmx 选项后,如果堆使用量增加,JVM 也不应该抛出“内存不足”。这让我怀疑内存正在被堆空间之外的其他东西泄漏。从内存转储来看,堆内存似乎没有增加。

感谢您的回答。

【问题讨论】:

  • 强烈建议:熟悉 JConsole 工具(或您的 JVM 的等效工具),看看它是否可以阐明正在发生的事情:docs.oracle.com/javase/1.5.0/docs/guide/management/…
  • 您是否对字符串使用了很多操作?当您修改 String 时,会创建一个新对象(StringBuffer 不是这样)。旧的不会立即销毁。 jvm 让他呆一段时间,因为你可能会再次需要它。
  • 当前的 Java 版本会在后台为您自动生成 StringBuilders 用于字符串连接。尽可能选择 StringBuilders(非同步)而不是 StringBuffers!
  • Perello :是的,我使用了很多字符串,堆中有一堆未收集的字符串。问题是如果我对堆大小有上限,为什么进程占用越来越多的内存。为什么它不执行 OutOfMemory 并停止。我强烈感觉到堆以外的东西正在占用内存。

标签: java linux memory-management memory-leaks process


【解决方案1】:

您如何测量内存使用情况?

通常有3种内存使用:

  • VIRT -- 虚拟内存大小 (KiB) 任务使用的虚拟内存总量。它 包括所有代码、数据和共享库以及页面 已被换出且已映射但未映射的页面 用过。
  • RES -- 驻留内存大小 (KiB) 任务已使用的非交换物理内存。
  • SHR -- 共享内存大小 (KiB) 它 只是反映记忆 可能会与其他进程共享。

虚拟内存大小可以变得比您使用 -Xmx 指定的更大(几 GB),但这不会造成任何损害。 RES 加 SHR 是您应该关注的。

除了堆之外,还有另一类内存使用不受 -Xmx (permgen) 的影响。但这通常以几 MB 为上限。您可能想阅读HotSpot GC Tuning Guide

【讨论】:

  • 这里说的是RES内存。
  • 另见*.com/questions/12292368/…: - 大量线程堆栈, - 内存映射文件在应该关闭时没有被关闭, - 一些本机代码库使用(可能泄漏)out-of -堆内存。
【解决方案2】:

让我用一个成熟的“回应”来补充我的“评论”。

如果您要进行大量字符串操作,那么您绝对应该使用“String”类。无论发生什么,Java 都有许多很棒的工具(包括但不限于 JConsole),可以让您智能地分析问题。你的两个新BFFs 应该是:

  • StringBuilder(有效地处理字符串)和

  • JConsole(研究程序的行为;包括堆分配和垃圾回收)。

而且,正如 user643011 正确指出的那样,还有很多其他可能会“泄漏”的事情:包括未关闭的文件、大量线程使用大量堆栈空间等。

这是另一个不错的链接:

【讨论】:

  • 嗨,保罗,我同意你的推理。然而,我的问题是我没有收到内存不足错误,而且我的堆空间仅为 512 MB,远小于实际进程大小。所以还有其他东西占用了 1.5 G。
  • 1) 我听说问题不在于“堆”本身,2) 这就是我引用这些特定链接的原因:它们应该为您提供大量工具和大量提示,3) 看看特别是对于“不关闭/不释放”、“#/threads”和“递归”,以及仔细检查抛出异常的方法(并仔细检查它的堆栈回溯!):*.com/questions/4512147/…跨度>
【解决方案3】:

如果您怀疑您的 java 应用程序中存在内存泄漏,您绝对应该尝试Plumbr。它非常好,可以发现它们并提供非常有用的报告。

【讨论】: