Am un server lucee (ColdFusion) în producție.
La început, am întâlnit epuizarea memoriei sistemului de operare. Am redus -Xmx2048m
la jumătate din memoria disponibilă și setată -XX:MaxMetaspaceSize=1000m
.
După un timp, tomcat-ul lui lucee a raportat erori OutOfMemory și a cerut o repornire.
Deoarece metaspațiul este în plus față de heap și implicit nu este limitat, acest lucru indică faptul că metaspațiul se umple.
Am adăugat apoi un obișnuit jcmd <pid> VM.metaspace
pentru a verifica această presupunere.
Dimineata am:
totalul grămadă de gunoi primul 1572864K, utilizat 959885K [0x0000000080000000, 0x0000000100000000)
dimensiunea regiunii 1024K, 249 tineri (254976K), 18 supraviețuitori (18432K)
Metaspace folosit 99985K, capacitate 102839K, comisionat 104996K, rezervat 1114112K
spațiu de clasă folosit 7301K, capacitate 8154K, angajat 8320K, rezervat 1015808K
iar seara:
totalul deșeurilor de gunoi primul 1616896K, utilizat 556546K [0x0000000080000000, 0x0000000100000000)
dimensiunea regiunii 1024K, 25 tineri (25600K), 5 supraviețuitori (5120K)
Metaspațiu utilizat 108125K, capacitate 111035K, comisionat 113828K, rezervat 1122304K
spațiu de clasă folosit 7509K, capacitate 8463K, angajat 8704K, rezervat 1015808K
Așadar, metaspațiul crește cu aproximativ 8Mb pe zi!
Am descoperit că JAXB a avut o problemă care cauzează acest comportament, așa că am încercat acea soluție prin adăugare -Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true
dar nu a ajutat sau poate a înrăutățit situația.
Cum pot afla ce naiba îmi umple metaspațiul?