ฉันมีเซิร์ฟเวอร์ lucee (ColdFusion) ในการผลิต
ในตอนแรก เราพบว่าหน่วยความจำ OS หมด เราลดการ -xmx2048m
หน่วยความจำที่มีอยู่ครึ่งหนึ่งและตั้งค่า -XX:MaxMetaspaceSize=1000m
.
หลังจากนั้นไม่นาน Tomcat of Lucee ก็รายงานข้อผิดพลาด OutOfMemory และจำเป็นต้องรีสตาร์ท
เนื่องจากเมตาสเปซอยู่นอกเหนือฮีปและไม่จำกัดตามค่าเริ่มต้น ซึ่งบ่งชี้ว่าเมตาสเปซกำลังเต็ม
ฉันได้เพิ่มปกติแล้ว jcmd <pid> VM.metaspace
เพื่อตรวจสอบสมมติฐานนี้
ในตอนเช้าฉันมี:
กองขยะแรกรวม 1572864K ใช้ 959885K [0x0000000080000000, 0x0000000100000000)
ขนาดภูมิภาค 1024K, 249 หนุ่ม (254976K), ผู้รอดชีวิต 18 คน (18432K)
Metaspace ใช้ 99985K, ความจุ 102839K, มุ่งมั่น 104996K, สงวนไว้ 1114112K
พื้นที่คลาสที่ใช้ 7301K, ความจุ 8154K, มุ่งมั่น 8320K, สงวนไว้ 1015808K
และในตอนเย็น:
กองขยะแรกรวม 1616896K ใช้ 556546K [0x0000000080000000, 0x0000000100000000)
ขนาดภูมิภาค 1024K เด็ก 25 คน (25600K) ผู้รอดชีวิต 5 คน (5120K)
Metaspace ใช้ 108125K, ความจุ 111035K, มุ่งมั่น 113828K, สงวนไว้ 1122304K
พื้นที่คลาสที่ใช้ 7509K, ความจุ 8463K, มุ่งมั่น 8704K, สงวนไว้ 1015808K
ดังนั้น Metaspace จึงเติบโตประมาณ 8Mb ต่อวัน !
ฉันพบว่า JAXB มีปัญหาที่ทำให้เกิดพฤติกรรมนี้ ดังนั้นฉันจึงลองวิธีแก้ไขโดยเพิ่ม -Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true
แต่มันไม่ได้ช่วยหรืออาจทำให้แย่ลง
ฉันจะรู้ได้อย่างไรว่าเมตาสเปซของฉันเต็มไปด้วยอะไร