【问题标题】:Where is my Java memory going?我的 Java 内存去哪儿了?
【发布时间】:2011-09-12 18:41:45
【问题描述】:

我正在从 Ant 或 Eclipse 运行 JUnit 测试套件。 PermGen 限制为 200 MB,堆限制为 1000 MB。

Java VisualVM 报告将 PermGen 分配为 200 MB,将堆分配为 350 MB。那是 550 MB。

但是,此进程的总虚拟集大小为 2.5 GB,驻留集大小为 1.8 GB。我知道应该有一些开销,但是如果 PermGen 和堆是 0.5 GB 并且进程使用 1.8 GB,那么缺少的 1.3 GB 在哪里?如何诊断和修复它?

【问题讨论】:

  • 你使用任何原生库吗?它们的本机内存分配不会显示在 VisualVM 中。另外,没有 VisualVM 的进程大小是否相同?
  • 除了来自 Sun 的标准 JVM 之外,没有本地库。没有 VisualVM 也一样。
  • @Konrad 你在使用任何内存分析工具来查看吗?
  • Ubuntu Linux,来自 Sun 的 Java 6。

标签: java memory memory-leaks


【解决方案1】:

什么是无堆比率?您是否使用默认的 70 和 40%。也许,有垃圾对象等待下一次 gc 运行收集。也可能是 java 进程为自己分配了额外的内存(了解堆空闲率)。

也许Tuning Garbage Collection parameters in Java 提到的问题/答案/ cmets 提供了一些帮助。

【讨论】:

  • 我没有调整甚至不知道这个值。但是,我使用 -Xmx800m 开始该过程,根据 VisualVM,它只分配了 350 MB,并且使用了其中的 50-70%。就算提前预留了500MB,也离1300还差得很远。
  • 默认最小堆空闲率为40%,最大空闲堆率为70%;占总堆大小的百分比。
  • 我还更新了我的答案,指出另一个可能有用的问题。
【解决方案2】:

请检查此eclipse plugin 进行内存分析。安装后,它会提供不同的视图。在一个particular view 中,它显示了单个对象使用的内存。这将帮助您查明正在使用内存的对象。

编辑:我想我错过了非堆部分。

【讨论】:

  • 这如何回答我关于非堆内存的问题?
猜你喜欢
  • 2012-03-11
  • 2010-10-13
  • 2016-03-24
  • 2011-10-25
  • 1970-01-01
  • 2017-02-06
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多