我有一个在HotSpot jvm 1.8.0_45上运行的应用程序,它有8 8GB的堆。应用程序尝试为新对象分配内存失败,出现堆空间OOM错误。我查看了堆转储,发现大部分空间被T4CConnection实例的charBufferCaches占用。这个缓存保存字符数组的SoftReferences。我很惊讶SoftReferences没有在OOM之前发布。我仔细检查了这个数组是否有硬引用,但没有找到。
当应用程序通过SoftReferences保存3 3GB的字符数组时,为什么我有堆空间OOM?当应用程序需要新内存时,为什么不释放此SoftReferences?
显示charBufferCache的T4CConnection对象的一部分:
在T4CConnection charBufferCache中保留的字符数组的传入引用:
发布于 2016-03-04 09:06:03
理想情况下,软引用应该在抛出OOM之前被清除。我怀疑程序中有一些内存泄漏。
你可能想看看这里- How to cause soft references to be cleared in Java?
尝试使用-XX:SoftRefLRUPolicyMSPerMB=<value>
参数来限制软引用的大小,并检查它是否有帮助。这可能会为下一步提供方向。
发布于 2016-03-04 09:15:42
仅当清除对象时,才会清除SoftReference或WeakReference。如果它不会阻止一个对象被收集,但如果该对象在某个地方有一个强引用,它将在GC之后被保留。
例如:
Double d = new Double(123456);
WeakReference<Double> ref = new WeakReference<>(d);
System.gc();
System.out.println(ref.get() + " == " + d); // both not null.
https://stackoverflow.com/questions/35791501
复制相似问题