Tôi có một máy chủ lucee (ColdFusion) đang được sản xuất.
Lúc đầu, chúng tôi gặp phải tình trạng cạn kiệt bộ nhớ hệ điều hành. chúng tôi giảm -Xmx2048m
đến một nửa bộ nhớ khả dụng và đặt -XX:MaxMetaspaceSize=1000m
.
Tuy nhiên, sau một thời gian, tomcat của lucee báo lỗi OutOfMemory và yêu cầu khởi động lại.
Vì không gian siêu dữ liệu bổ sung cho heap và theo mặc định là không bị giới hạn, điều này cho thấy rằng không gian siêu dữ liệu đang được lấp đầy.
sau đó tôi đã thêm một thường xuyên jcmd <pid> VM.metaspace
để kiểm chứng giả định này.
Vào buổi sáng, tôi có:
đống rác đầu tiên tổng cộng 1572864K, đã sử dụng 959885K [0x0000000080000000, 0x0000000100000000)
kích thước vùng 1024K, 249 trẻ (254976K), 18 người sống sót (18432K)
Metaspace đã sử dụng 99985K, dung lượng 102839K, cam kết 104996K, dự trữ 1114112K
không gian đẳng cấp sử dụng 7301K, dung lượng 8154K, cam kết 8320K, dành riêng 1015808K
và trong buổi tối:
đống rác đầu tiên tổng cộng 1616896K, đã sử dụng 556546K [0x0000000080000000, 0x0000000100000000)
kích thước khu vực 1024K, 25 trẻ (25600K), 5 người sống sót (5120K)
Metaspace đã sử dụng 108125K, dung lượng 111035K, cam kết 113828K, dự trữ 1122304K
không gian đẳng cấp sử dụng 7509K, dung lượng 8463K, cam kết 8704K, dành riêng 1015808K
Vì vậy, metaspace đang tăng khoảng 8Mb mỗi ngày!
Tôi nhận thấy rằng JAXB gặp sự cố gây ra hành vi này, vì vậy tôi đã thử giải pháp đó bằng cách thêm -Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true
nhưng nó đã không giúp đỡ hoặc có thể làm cho nó tồi tệ hơn.
Làm cách nào tôi có thể tìm ra cái quái gì đang lấp đầy không gian siêu dữ liệu của mình?