WeakReference和内存泄漏

时间:2011-10-30 09:28:44

标签: java memory-leaks weak-references

我正在使用VisualVM分析我的应用程序,我发现堆大小在大约3天内增加了大约7MB。当我使用内存采样器时,我也看到java.lang.ref.WeakReference在实例编号的前五位。 WeakReference的数量正在增加,GC几乎没有效果。

有什么想法吗?

3 个答案:

答案 0 :(得分:5)

您没有内存泄漏。

Java的GC仅在堆已满时运行(实际上有点复杂,因为堆本身被分成几代,但无论如何),所以除非你填充堆(这是非常不可能的,因为7Mb的内存太少对于任何堆),你不能告诉你是否有泄漏。

WeakReferences是小包装器,它实际上有助于防止内存泄漏,方法是将它们引用的对象标记为GC的易读性。我的猜测是你要包含某种缓存库来创建一堆这样的缓存库,而且由于堆仍然有足够的空间,所以不需要垃圾收集它们。

同样,除非您发现GC经常运行且堆大小仍然增加,否则我不会担心内存问题。

这是a great article on this matter

答案 1 :(得分:1)

在JVM运行完整GC的情况下,WeakReferences是最先收集的,但是,它们不能强/轻可达(没有强/软引用必须持有对它的引用)。我通常最不担心WeakReferences,他们最终会得到GC-ed。您应该检查您的GC循环(jstat),看看是否GC没有声明这些参考。另外,请不要推断泄漏,您的应用程序可能不一定会在接下来的几天内增加其内存消耗。我建议在非生产环境中运行一个长时间(48小时?)的性能测试,并检查是否遇到内存问题。

答案 2 :(得分:1)

VisualVM使用系统中的资源。与商业分析师相比,这是其弱点之一。因为VisualVM不能轻易看到这种微小差异,因为它会产生自己的噪音。

让我们说你在3天内泄漏了7 MB(我怀疑)。你花多少时间来修复它? 16 GB的内存大约需要100美元,因此7 MB的价值约为5美分,或大约3秒的时间。如果它更大,更大,我会更担心它。