โดยเฉพาะเหตุใดจึงช่วยแก้ไขปัญหา PermGen OutOfMemoryError
นอกจากนี้คะแนนโบนัสสำหรับคำตอบที่ชี้ให้ฉันไปที่เอกสารเกี่ยวกับข้อโต้แย้ง JVM ...
โดยเฉพาะเหตุใดจึงช่วยแก้ไขปัญหา PermGen OutOfMemoryError
นอกจากนี้คะแนนโบนัสสำหรับคำตอบที่ชี้ให้ฉันไปที่เอกสารเกี่ยวกับข้อโต้แย้ง JVM ...
คำตอบ:
พื้นที่ถาวรคือที่ซึ่งคลาสวิธีการสตริงภายในและวัตถุที่คล้ายกันที่ใช้โดย VM จะถูกจัดเก็บและไม่ถูกจัดสรรคืน (ด้วยเหตุนี้ชื่อ)
บทความ Oracle ฉบับนี้นำเสนอการทำงานและการกำหนดพารามิเตอร์ของ HotSpot GC อย่างชัดเจนและแนะนำให้คุณเพิ่มพื้นที่นี้หากคุณโหลดคลาสจำนวนมาก (ซึ่งโดยปกติจะเป็นกรณีของแอพพลิเคชันเซิร์ฟเวอร์และ IDE บางตัวเช่น Eclipse):
รุ่นถาวรไม่มีผลกระทบต่อประสิทธิภาพการทำงานของตัวรวบรวมขยะสำหรับแอ็พพลิเคชันส่วนใหญ่ อย่างไรก็ตามบางแอปพลิเคชั่นสร้างและโหลดคลาสจำนวนมากแบบไดนามิก ตัวอย่างเช่นการใช้งานบางอย่างของหน้า JavaServer หน้า (JSP) แอปพลิเคชันเหล่านี้อาจต้องการรุ่นถาวรที่มีขนาดใหญ่กว่าเพื่อเก็บคลาสเพิ่มเติม หากเป็นเช่นนั้นขนาดการสร้างถาวรสูงสุดสามารถเพิ่มได้ด้วยตัวเลือกบรรทัดคำสั่ง -XX: MaxPermSize =
โปรดทราบว่าเอกสารอื่น ๆ ของออราเคิลแสดงรายการอาร์กิวเมนต์ HotSpot อื่น ๆ
อัปเดต:เริ่มต้นด้วย Java 8 ทั้งพื้นที่ Permgen และการตั้งค่านี้จะหายไป รุ่นหน่วยความจำที่ใช้สำหรับคลาสที่โหลดและวิธีการจะแตกต่างกันและไม่ จำกัด (ด้วยการตั้งค่าเริ่มต้น) คุณไม่ควรเห็นข้อผิดพลาดนี้อีก
-XX:PermSize -XX:MaxPermSize
ใช้สำหรับกำหนดขนาดสำหรับรุ่นถาวร
การสร้างถาวร: การสร้างถาวรเป็นที่เก็บไฟล์คลาส นี่คือผลลัพธ์ของคลาสที่คอมไพล์และเพจ JSP หากพื้นที่นี้เต็มก็จะทริกเกอร์การรวบรวมขยะแบบเต็ม หาก Full Garbage Collection ไม่สามารถล้างคลาสเก่าที่ไม่มีการอ้างอิงและไม่มีพื้นที่เหลือสำหรับขยายพื้นที่ถาวรจะเกิดข้อผิดพลาดหน่วยความจำ Out (OOME) (OOME) และ JVM จะผิดพลาด
ใน Java 8 พารามิเตอร์นั้นมักใช้พิมพ์ข้อความเตือนเช่นนี้
คำเตือนเซิร์ฟเวอร์ VM 64 บิตของ Java HotSpot (TM): ละเว้นตัวเลือก MaxPermSize = 512m; การสนับสนุนถูกลบใน 8.0
เหตุผลที่คุณได้รับข้อความนี้ใน Java 8 เป็นเพราะ Permgen ถูกแทนที่โดย Metaspace เพื่อจัดการกับข้อเสียบางอย่างของ PermGen (อย่างที่คุณเห็นได้ด้วยตัวเองข้อเสียอย่างหนึ่งคือมันมีขนาดคงที่)
FYI: บทความเกี่ยวกับ Metaspace: http://java-latte.blogspot.in/2014/03/metaspace-in-java-8.html