首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java进程占用越来越多的内存

Java进程占用越来越多的内存
EN

Stack Overflow用户
提问于 2012-09-24 07:31:24
回答 3查看 3.1K关注 0票数 0

全,

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

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

我有以下问题:

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

谢谢你的回答。

EN

回答 3

Stack Overflow用户

发布于 2012-09-24 07:38:11

你是如何测量内存使用情况的?

通常有三种内存使用方式:

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

虚拟内存大小可以比用-Xmx指定的更大(几GB),但这不会造成任何损害。再加上SHR是你应该看到的。

除了堆之外,还有另一类内存使用不受-Xmx (permgen)的影响。但这通常被限制在几MB。您可能需要阅读HotSpot GC调谐指南

票数 5
EN

Stack Overflow用户

发布于 2012-09-24 19:59:52

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

如果您正在执行大量的字符串操作,则绝对不应该使用" string“类。不管发生什么,Java都有许多很棒的工具(包括但不限于JConsole),它们可以让您智能地分析问题。您的两个新BFFs应该是:

  • StringBuilder (高效地操纵字符串)和
  • JConsole (研究程序的行为;包括堆分配和垃圾收集)。

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

下面是另一个很好的链接:

票数 1
EN

Stack Overflow用户

发布于 2012-10-01 13:02:39

如果您怀疑java应用程序中的内存泄漏,那么一定要尝试普朗布尔。这是相当好和发现他们,并给出相当有用的报告。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12560612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档