我的应用程序在HotSpot jvm 1.8.0_45上运行,并且包装好8GB。应用程序尝试为新对象分配内存失败,堆空间OOM错误。我查看了堆转储,发现大部分空间都被T4CConnection实例的charBufferCaches占用。此缓存为char数组保存SoftReferences。我很惊讶在OOM之前没有发布SoftReferences。我仔细检查了这个阵列是否有硬参考,但没有找到。
当应用程序通过SoftReferences保存3GB的char数组时,为什么我有堆空间OOM? 当应用程序需要新内存时,为什么不发布此SoftReferences?
显示charBufferCache的T4CConnection对象的一部分:
char数组的传入引用保存在T4CConnection charBufferCache:
答案 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.