内存泄漏在jdk1.7.0中

时间:2011-12-19 08:40:45

标签: java memory-leaks java-7

我们尝试过jdk 1.7.0_02。运行十天给出以下物体的420 MB内存泄漏:
- java.lang.management.MemoryUsage,
- [C(char数组),
- 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 个答案:

答案 0 :(得分:4)

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

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