jdk1.7.0中的内存泄漏

Posted

技术标签:

【中文标题】jdk1.7.0中的内存泄漏【英文标题】:Memory leak in jdk1.7.0 【发布时间】:2011-12-19 08:40:45 【问题描述】:

我们已经尝试过 jdk 1.7.0_02。运行 10 天,以下对象出现 420 MB 内存泄漏: - java.lang.management.MemoryUsage, - [C(字符数组), - java.util.HashMap$Entry, - [Ljava.util.HashMap$Entry(HashMap$Entry 数组), 和其他一些人。

这不会发生在 jdk1.6.x 上。

“jmap -histo:live”命令的第一个输出:

 num     #instances         #bytes  class name
----------------------------------------------
   1:        229527       14926888  [C
   2:        289290       13885920  java.lang.management.MemoryUsage
   3:        321029       10272928  java.util.HashMap$Entry
   4:         69923       10262184  <constMethodKlass>
   5:         69923        9527672  <methodKlass>
   6:          7048        7787040  <constantPoolKlass>
   7:        241693        7734176  java.lang.String
   8:          2038        5898408  [Ljava.util.concurrent.ConcurrentHashMap$HashEntry;
   9:          7048        5479056  <instanceKlassKlass>
  10:          5954        4499552  <constantPoolCacheKlass>
  11:         67844        4091672  [Ljava.util.HashMap$Entry;
  12:         41250        3942848  [B
  13:         65649        3151152  java.util.HashMap
  14:         71891        2875640  java.util.TreeMap$Entry
...
Total       2320965      138000120

“jmap -histo:live”命令的最后一次输出在第一次之后的 10 天内完成:

 num     #instances         #bytes  class name
----------------------------------------------
   1:       3147110      151061280  java.lang.management.MemoryUsage
   2:       3178875      101724000  java.util.HashMap$Entry
   3:       1087332       53822632  [C
   4:       1099503       35184096  java.lang.String
   5:        639442       31529224  [Ljava.util.HashMap$Entry;
   6:        637247       30587856  java.util.HashMap
   7:        629422       25176880  [Ljava.lang.management.MemoryUsage;
   8:        314711       17623816  com.sun.management.GcInfo
   9:         70107       10292776  <constMethodKlass>
  10:        631864       10109824  java.util.HashMap$EntrySet
  11:        314711       10070752  sun.management.GcInfoCompositeData
  12:         70107        9552696  <methodKlass>
  13:          7075        7817080  <constantPoolKlass>
  14:        314713        7554128  [Ljava.lang.Integer;
  15:          2048        5898744  [Ljava.util.concurrent.ConcurrentHashMap$HashEntry;
  16:          7075        5497200  <instanceKlassKlass>
  17:        315792        5052672  java.lang.Integer
  18:         47680        4912352  [B
...
Total      13206419      558217856

我还有 8 个其他直方图,是在每天测试后制作的。它们显示对象的线性数量增加。这绝对不是噪音。这是每天 42 MB 的稳定泄漏。

您是否观察到类似的行为?在什么场景下?你是如何应对的?

【问题讨论】:

-1 没问题;如果这是一个错误报告:联系 Oracle。 @CodeBrickie,问题是 - 你有没有观察到类似的行为?在哪些场景下?你是如何应对的? 【参考方案1】:

鉴于 Java 7 中的代码与 Java 6 略有不同(但几乎相同)。我希望看到这些非常细微的差异。我会在 2 天后拍摄快照,看看 JVM 是否仍在预热。例如,连接更多监控客户端会增加这些值(因为这些主要是监控对象)。

如果是内存泄漏,每两天 32K,这可能会在运行一年后浪费大约 5 MB,并且价值不到 5 美分的内存。我个人认为这太小了,不用担心。

【讨论】:

其实数字之间的差异很小,可以认为是噪声(可能是某个时间点的临时物体)。这些数字几乎不能证明存在内存泄漏。 @Jesper 我怀疑你是对的,这就是为什么需要更多样本(可能每周),如果你认为值得做的话。 @Peter Lawrey,有一个错误。目前,上述两个直方图之间的间隔是 10 分钟,而不是 2 天。我将很快提供间隔非常大的直方图数量。

以上是关于jdk1.7.0中的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

Icarousel 内存泄漏中的泄漏

如何检查 C++ 代码中的内存泄漏。有没有检查内存泄漏的免费工具[重复]

Java中的内存泄漏

Java中的内存泄漏问题

NSMutableDictionary 中的内存泄漏

避免、发现和消除 Cocoa 中的内存泄漏