我有运行在 HotSpot jvm 1.8.0_45 上的应用程序,具有良好的 8GB 堆。应用程序尝试为新对象分配内存失败并出现堆空间 OOM 错误。我查看了堆转储,发现大部分空间被 T4CConnection 实例的 charBufferCaches 占用。此缓存保存 char 数组的 SoftReference。我很惊讶 SoftReferences 没有在 OOM 之前发布。我仔细检查了这个数组是否有硬引用,但没有找到。
当应用程序通过 SoftReferences 保存 3GB 的字符数组时,为什么我有堆空间 OOM?为什么当应用程序需要新内存时这个 SoftReferences 没有被释放?
显示 charBufferCache 的 T4CConnection 对象的一部分:
T4CConnection charBufferCache 中保存的 char 数组的传入引用: