บทความนี้วิเคราะห์เหตุผลว่าทำไมหน่วยความจำของ Java Memory Overflow มีรายละเอียดมากขึ้น แบ่งปันสำหรับทุกคนสำหรับการอ้างอิงของคุณ ข้อมูลเฉพาะมีดังนี้:
พบระบบออนไลน์ที่รายงาน java.lang.outofMemoryError: ข้อผิดพลาดของพื้นที่ Permgen คุณต้องค้นหาปัญหา ฉันได้รับสิ่งนี้มานานแล้วและตอนนี้ฉันจำไม่ได้จริงๆ แต่นี่เป็นคำถามที่น่าสนใจจริงๆ ก่อนอื่นปฏิกิริยาแรกคือการเพิ่ม -xx:+printgcdetails พารามิเตอร์เพื่อดูบันทึก GC ที่เฉพาะเจาะจง แต่เนื่องจากโปรแกรมเริ่มต้นโดย Tomcat ฉันกังวลว่ามีหลายสิ่งที่ห่อหุ้มอยู่ภายใน
จากนั้นมาดูสาเหตุของข้อผิดพลาดนี้
ชื่อเต็มของพื้นที่ Permgen เป็นพื้นที่ผลิตถาวรซึ่งหมายถึงพื้นที่การเก็บรักษาถาวรของหน่วยความจำ ภูมิภาคที่แตกต่างกัน สถานที่ก่อนการแข่งขันบน JSP หากคุณใช้โถที่สามจำนวนมากภายใต้เว็บแอปของคุณขนาดเกินขนาดเริ่มต้น (4M) ของ JVM ข้อความแสดงข้อผิดพลาดนี้จะถูกสร้างขึ้น
จากนั้นเรามาเพิ่มขนาดหน่วยความจำเริ่มต้นของ permgen:
เพิ่มที่จุดเริ่มต้นของ Linux ที่จุดเริ่มต้นของไฟล์ catalina.sh: รหัสคัดลอกรหัสดังนี้: java_opts = "-xms1024m -xmx1024m -xx: permsize = 256m -xx: maxpermsize = 256m" "" "" "
บวกที่จุดเริ่มต้นของไฟล์ของ catalina.bat ภายใต้ windows: รหัสคัดลอกรหัสดังนี้: ตั้ง java_opts = -xms1024m -xmx1024m -xx: permsize = 256m -xx: maxpermssize = 256m
จากนั้นเรายังคงใช้หน่วยความจำภาพเพื่อดูเครื่องมือเพื่อค้นหาปัญหาเฉพาะ เครื่องมือที่ต้องการสำหรับ JDK6 เป็นเครื่องมือของตัวเอง ครั้งนี้ฉันพบปัญหาแปลก ๆ อีกอย่างหนึ่งนั่นคือกระบวนการ Tomcat ไม่สามารถพบได้หลังจากเปิดเครื่องมือการวิเคราะห์ (พบว่า JRE เริ่มต้นขึ้นหลังจากนั้นและมันควรจะเพียงพอที่จะเปลี่ยนเป็น JDK)
เนื่องจากไม่อนุญาตให้มีพื้นที่ท้องถิ่นฉันสามารถเชื่อมต่อจากระยะไกลได้เพียงเปิด JMX
เช่นเดียวกับข้างต้นเพิ่มรหัสคัดลอกรหัสไปยังจุดเริ่มต้นของไฟล์ java_opts ของไฟล์ catalina.sh.sh หรือ catalina.bat ดังต่อไปนี้: -djava.rmi.server.hostname = 192.168.1.101-dcom = 900 0-- dcom.sun.management.jmxremote.ssl = false -dcom.sun.management.jmxremote.authenticate = false
หลังจากเริ่มโปรแกรมให้ตรวจสอบว่าพอร์ตเปิดอย่างถูกต้องเพื่อให้แน่ใจว่าสามารถเชื่อมต่อระยะไกลได้หรือไม่
ฉันขี้เกียจที่นี่และปิดการรับรองความถูกต้อง การตั้งค่านี้มีประสิทธิภาพบนพีซีในพื้นที่ของฉัน แต่มันไม่เพียงพอบนเซิร์ฟเวอร์ เปิด jvisualvm, คลิกไฟล์-> เพิ่มการเชื่อมต่อ JMX จากนั้นเพิ่ม localhost: 1000 และเชื่อมต่อ
หลังจากโปรแกรมก่อนหน้าการสังเกตการเปลี่ยนแปลงหน่วยความจำเป็นระยะเวลาหนึ่งฉันมุ่งเน้นไปที่สถานการณ์ของ PERC อาจเป็นไปได้ว่าขนาดของหน่วยความจำ PERM ไม่ได้มีผลมาก่อนเนื่องจากการเริ่มต้นของ Perm เริ่มต้นคือ 16m และสูงสุดคือ 64m และจำนวนอาชีพที่เกิดขึ้นจริงอาจทำให้เกิดปัญหานี้ได้ . หากคุณต้องการค้นหาปัญหาเพิ่มเติมคุณสามารถใช้ BTRACE เพื่อดูสถานที่ที่มีการเรียกวิธีการบางอย่าง สิ่งนี้สามารถวางตำแหน่งว่าวิธีการบางอย่างจะถูกดำเนินการตามที่คาดไว้หรือไม่
หวังว่าบทความนี้จะเป็นประโยชน์กับการออกแบบโปรแกรม Java ของทุกคน