OOM错误和奇怪的SoftReferences

时间:2016-03-04 08:43:08

标签: java garbage-collection jvm-hotspot heap-dump soft-references

我的应用程序在HotSpot jvm 1.8.0_45上运行,并且包装好8GB。应用程序尝试为新对象分配内存失败,堆空间OOM错误。我查看了堆转储,发现大部分空间都被T4CConnection实例的charBufferCaches占用。此缓存为char数组保存SoftReferences。我很惊讶在OOM之前没有发布SoftReferences。我仔细检查了这个阵列是否有硬参考,但没有找到。

当应用程序通过SoftReferences保存3GB的char数组时,为什么我有堆空间OOM? 当应用程序需要新内存时,为什么不发布此SoftReferences?

显示charBufferCache的T4CConnection对象的一部分:

part of T4CConnection object showing charBufferCache

char数组的传入引用保存在T4CConnection charBufferCache:

incoming references for char array holded at T4CConnection charBufferCache

2 个答案:

答案 0 :(得分:1)

理想情况下,在抛出OOM之前应该清除软引用。我怀疑程序中有一些内存泄漏..

您可能需要查看此处 - How to cause soft references to be cleared in Java?

尝试-XX:SoftRefLRUPolicyMSPerMB=<value>参数来限制软引用的大小并检查它是否有帮助。这可能为下一步提供方向。

答案 1 :(得分:-1)

只有在清理对象时才会清除SoftReference或WeakReference。它不会阻止收集对象,但如果该对象在某处具有强引用,则它将在GC之后保留。

e.g。

Double d = new Double(123456);
WeakReference<Double> ref = new WeakReference<>(d);
System.gc();
System.out.println(ref.get() + " == " + d); // both not null.