У меня есть приложение, работающее на HotSpot jvm 1.8.0_45 с хорошо упакованной кучей 8 ГБ. Приложение пытается выделить память для новых объектов с ошибкой OOM в кучном пространстве. Я посмотрел на кучу кучи и обнаружил, что большая часть пространства занята charBufferCaches экземпляров T4CConnection. Эти кэши содержат SoftReferences для массивов char. Я был удивлен, что SoftReferences не был выпущен перед OOM. Я дважды проверял, есть ли жесткие ссылки для этих массивов, но не нашел их.Ошибка OOM и странные SoftReferences
Почему у меня есть область памяти с кучей, когда приложение хранит 3 ГБ массивов символов SoftReferences? Почему это SoftReferences не выпущено, когда приложение нуждается в новой памяти?
Часть объекта T4CConnection показывая charBufferCache:
Входящие ссылки на массив символов holded в T4CConnection charBufferCache:
Когда была взята свалка? возможно, что массив был оставлен чем-то в стеке, и это не отразилось на дампе после того, как стек был размотан из-за исключения. также конкретный тип вопросов ООМ, например. превышение должно было произойти, даже если запрос на распределение мог быть выполнен после освобождения мягких ссылок. – the8472
Дамп был создан с использованием опции + HeapDumpOnOutOfMemoryError JVM. Я думал, что моментальные снимки, созданные этой опцией, должны содержать все объекты и ссылки в момент появления ошибки OOM. Есть ли вероятность, что некоторые ссылки будут отсутствовать в снимке? Кроме того, мое приложение не потребляет память большими кадрами - нет никаких шансов, что он попытается сразу выделить объект 2GB. – nukie
Да, я думаю, что этот параметр включает в себя корни стека. но точный тип OOME все равно может иметь значение. – the8472