Утечка, которую не видит heap dump Интересная ловушка: вызываешь… — Библиотека джависта | Java, Spring, Maven, Hibernate — TG.ME

🤩 Утечка, которую не видит heap dump

Интересная ловушка: вызываешь string.intern() на динамических строках, приложение падает с OOM, делаешь heap dump — а там всё чисто. Где утечка?

🤩 Суть проблемы

String Pool до Java 7 жил в PermGen, с Java 7 переехал в heap. Казалось бы, проблема решена. Но нет.

Внутри String Pool использует нативную хеш-таблицу StringTable, которая живёт в native memory (вне heap). Когда ты делаешь intern(), в heap создаётся сама строка, но ссылка на неё хранится в нативной StringTable.

🤩 Что происходит

Строки попадают в heap (GC их уберёт), но StringTable в native memory растёт бесконечно. Размер StringTable фиксирован и задаётся -XX:StringTableSize. При переполнении — коллизии, деградация, OOM.

🤩 Как увидеть?


bashjcmd <pid> VM.stringtable


Или Native Memory Tracking:


bash-XX:NativeMemoryTracking=detail
jcmd <pid> VM.native_memory


Ищи раздел Symbol — там StringTable.

⚠️ String Pool — это не только heap. StringTable живёт в native memory, и это классическая офф-хип утечка.

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта
September 1, 2026 697 1 12