java - 在调查内存泄漏时要寻找哪一代?

标签 java memory-leaks garbage-collection

我第一次调查可能导致我的服务器停止的潜在内存泄漏。我从日志中看到以下内容:

...
6676.590: [GC [PSYoungGen: 61432K->3902K(65408K)] 343313K->308460K(384896K), 0.0153165 secs] [Times: user=0.07 sys=0.10, real=0.02 secs] 
6684.493: [GC [PSYoungGen: 65406K->3900K(67200K)] 369964K->319251K(386688K), 0.0104186 secs] [Times: user=0.07 sys=0.04, real=0.01 secs] 
6684.503: [Full GC [PSYoungGen: 3900K->0K(67200K)] [PSOldGen: 315351K->256886K(333824K)] 319251K->256886K(401024K) [PSPermGen: 70248K->70248K(116736K)], 0.5965072 secs] [Times: user=0.60 sys=0.00, real=0.60 secs] 
6692.773: [GC [PSYoungGen: 63296K->1160K(62976K)] 320182K->258046K(396800K), 0.0043468 secs] [Times: user=0.04 sys=0.00, real=0.00 secs]
...

让我感到困惑的是,我应该在哪一代中寻找内存泄漏?全部?单独还是同时?

最佳答案

您只需要在 Full GC 之后查看 PSOldGen。保留任何时间长度的对象都会在那里。也就是说,在查找泄漏时,您无需担心生命周期短的对象。

如果您认为存在泄漏,请查看 jmap -histo:live 以了解哪些对象被保留得最多。您可以使用 jmap -dump:live,format=b,file={filename} 进行完整转储,以查看保留这些对象的原因。您可以使用 VisualVM 加载此文件。 (您也可以使用 VisualVM 来触发堆转储)

关于java - 在调查内存泄漏时要寻找哪一代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13398253/

相关文章:

c# - 您在哪个现实生活场景中使用了垃圾收集器?

用于特征向量/特征值计算的 Java 包?

java - iReport 中的错误日期破坏了 jasper 服务器报告

java - 在 android 和 java 项目之间共享源代码

powershell - 在 Powershell 中获取对象的内存大小

android - 如何判断哪些线程产生了所有垃圾?

java - 在 Java 中实现选择符号的好方法是什么?

delphi - FastMM 报告记录线程变量内存泄漏

找不到C程序中的内存泄漏

c# - 返回值内存范围