-XX: MaxPermSize ทำอะไร


260

โดยเฉพาะเหตุใดจึงช่วยแก้ไขปัญหา PermGen OutOfMemoryError

นอกจากนี้คะแนนโบนัสสำหรับคำตอบที่ชี้ให้ฉันไปที่เอกสารเกี่ยวกับข้อโต้แย้ง JVM ...



6
oracle.com/technetwork/java/javase/tech/…คุณจะให้คะแนนโบนัสกับฉันตอนนี้ได้อย่างไร :)
Denys Séguret

1
@PaulTomblin ฉันไม่แน่ใจว่าคนที่มีบทความที่คุณกำลังเชื่อมโยงไปถึง (ผลลัพธ์แรกจาก Google) มีความคิดว่าเขาพูดถึงอะไร
Denys Séguret

@dystroy ฉันสามารถส่งคุกกี้ให้คุณได้หรือไม่ หรือคุณก็อาจจะใช้ความพึงพอใจในการตอบคำถามได้ดี;)
เจฟฟ์

5
นี้ไม่ได้ตอบคำถามโดยเฉพาะ แต่ถ้าคุณกำลังมองหาการจัดการหน่วยความจำ JVM บทความที่ดีที่สุดที่ฉันได้อ่านมันคือสิ่งนี้และลิงค์ infoq
Abe

คำตอบ:


274

พื้นที่ถาวรคือที่ซึ่งคลาสวิธีการสตริงภายในและวัตถุที่คล้ายกันที่ใช้โดย VM จะถูกจัดเก็บและไม่ถูกจัดสรรคืน (ด้วยเหตุนี้ชื่อ)

บทความ Oracle ฉบับนี้นำเสนอการทำงานและการกำหนดพารามิเตอร์ของ HotSpot GC อย่างชัดเจนและแนะนำให้คุณเพิ่มพื้นที่นี้หากคุณโหลดคลาสจำนวนมาก (ซึ่งโดยปกติจะเป็นกรณีของแอพพลิเคชันเซิร์ฟเวอร์และ IDE บางตัวเช่น Eclipse):

รุ่นถาวรไม่มีผลกระทบต่อประสิทธิภาพการทำงานของตัวรวบรวมขยะสำหรับแอ็พพลิเคชันส่วนใหญ่ อย่างไรก็ตามบางแอปพลิเคชั่นสร้างและโหลดคลาสจำนวนมากแบบไดนามิก ตัวอย่างเช่นการใช้งานบางอย่างของหน้า JavaServer หน้า (JSP) แอปพลิเคชันเหล่านี้อาจต้องการรุ่นถาวรที่มีขนาดใหญ่กว่าเพื่อเก็บคลาสเพิ่มเติม หากเป็นเช่นนั้นขนาดการสร้างถาวรสูงสุดสามารถเพิ่มได้ด้วยตัวเลือกบรรทัดคำสั่ง -XX: MaxPermSize =

โปรดทราบว่าเอกสารอื่น ๆ ของออราเคิลแสดงรายการอาร์กิวเมนต์ HotSpot อื่น ๆ

อัปเดต:เริ่มต้นด้วย Java 8 ทั้งพื้นที่ Permgen และการตั้งค่านี้จะหายไป รุ่นหน่วยความจำที่ใช้สำหรับคลาสที่โหลดและวิธีการจะแตกต่างกันและไม่ จำกัด (ด้วยการตั้งค่าเริ่มต้น) คุณไม่ควรเห็นข้อผิดพลาดนี้อีก


93

-XX:PermSize -XX:MaxPermSize ใช้สำหรับกำหนดขนาดสำหรับรุ่นถาวร

การสร้างถาวร: การสร้างถาวรเป็นที่เก็บไฟล์คลาส นี่คือผลลัพธ์ของคลาสที่คอมไพล์และเพจ JSP หากพื้นที่นี้เต็มก็จะทริกเกอร์การรวบรวมขยะแบบเต็ม หาก Full Garbage Collection ไม่สามารถล้างคลาสเก่าที่ไม่มีการอ้างอิงและไม่มีพื้นที่เหลือสำหรับขยายพื้นที่ถาวรจะเกิดข้อผิดพลาดหน่วยความจำ Out (OOME) (OOME) และ JVM จะผิดพลาด


48

ใน 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


6
ดูเพิ่มเติม: การกำจัด PermGen ใน JDK 8 (stackoverflow)
จะ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.