У меня есть сервер lucee (ColdFusion) в производстве.
Сначала мы столкнулись с нехваткой памяти ОС. Мы сократили -Xmx2048м
на половину доступной памяти и установить -XX:MaxMetaspaceSize=1000м
.
Однако через некоторое время кот lucee сообщил об ошибках OutOfMemory и потребовал перезагрузки.
Поскольку метапространство является дополнением к куче и по умолчанию не ограничено, это указывает на то, что метапространство заполняется.
Затем я добавил обычный jcmd <pid> VM.metaspace
для проверки этого предположения.
Утром у меня:
мусорная куча всего 1572864 КБ, использовано 959885 КБ [0x0000000080000000, 0x0000000100000000)
размер региона 1024К, 249 молодых (254976К), 18 выживших (18432К)
Метапространство используется 99985 КБ, емкость 102839 КБ, выделено 104996 КБ, зарезервировано 1114112 КБ
используемое пространство класса 7301 КБ, емкость 8154 КБ, выделено 8320 КБ, зарезервировано 1015808 КБ
а вечером:
мусорная куча всего 1616896 КБ, использовано 556546 КБ [0x0000000080000000, 0x0000000100000000)
размер региона 1024К, 25 молодых (25600К), 5 выживших (5120К)
Метапространство используется 108 125 КБ, емкость 111 035 КБ, выделено 113 828 КБ, зарезервировано 1122 304 КБ.
используемое пространство класса 7509 КБ, емкость 8463 КБ, выделено 8704 КБ, зарезервировано 1015808 КБ
Итак, метапространство растет примерно на 8 Мб в день!
Я обнаружил, что у JAXB есть проблема, вызывающая такое поведение, поэтому я попробовал обходной путь, добавив -Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true
но это не помогло, а может усугубило.
Как я могу узнать, что, черт возьми, заполняет мое метапространство?