PermGen ย่อมาจากอะไร?


122

ฉันรู้ว่า PermGen คืออะไรใช้เพื่ออะไรทำไมมันถึงล้มเหลววิธีเพิ่ม ฯลฯ

สิ่งที่ฉันไม่รู้คือสิ่งที่ PermGen หมายถึงจริงๆ ปลัด ... เก็น ... บ้าง?

มีใครรู้บ้างว่า PermGen ย่อมาจากอะไร?


1
[คำอธิบายที่ดี] [1] จากคนที่รู้มากเกี่ยวกับ GC ภายใน มีข้อมูลเกี่ยวกับ GC ที่เป็นประโยชน์มากมายในบล็อกของเขา [1]: blogs.oracle.com/jonthecollector/entry/…
Ivan Dubrov

คำตอบ:


84

รุ่นถาวร รายละเอียดเกี่ยวกับการนำหลักสูตรไปใช้โดยเฉพาะ

โดยสังเขปประกอบด้วยอ็อบเจ็กต์ Java ที่เชื่อมโยงกับคลาสและสตริงภายใน ในการใช้งานไคลเอนต์ของ Sun โดยใช้การแชร์บนclasses.jsaหน่วยความจำจะถูกแมปเพื่อสร้างข้อมูลเริ่มต้นโดยมีประมาณครึ่งอ่านอย่างเดียวและครึ่งสำเนาบนเขียน

วัตถุ Java ที่เก่าแก่จะถูกเก็บไว้ใน Tenured Generation


19
"ใน JDK 7 สตริงภายในจะไม่ถูกจัดสรรในการสร้างฮีป Java แบบถาวรอีกต่อไป": oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html
almalkawi

30
และใน JDK 8 ไม่มีการสร้างแบบถาวรเลย! เป็นเรื่องสนุกที่ได้เห็นคำตอบนี้พัฒนาขึ้นในช่วงหลายปีที่ผ่านมา
Brian Gordon

3
@BrianGordon ถูกต้อง .. สำหรับข้อมูลเพิ่มเติมเกี่ยวกับที่stackoverflow.com/a/22509753/4557537
Fadi

59

JVM ใช้ PermGen เพื่อเก็บคลาสที่โหลด คุณสามารถเพิ่มได้โดยใช้:

-XX:MaxPermSize=384m

หากคุณใช้ Sun JVM หรือ OpenJDK

ดังนั้นหากคุณได้รับ OutOfMemoryException: PermGen คุณจำเป็นต้องทำให้ PermGen ใหญ่ขึ้นหรือคุณอาจมีปัญหาในการโหลดคลาส


6
คำตอบใดเป็นคำตอบที่ยอมรับในขณะที่คุณโพสต์ความคิดเห็นนี้ คำตอบที่ยอมรับในปัจจุบัน (คำตอบนี้โดย "Tom Hawtin - tackline") ดูเหมือนถูกต้องสำหรับฉัน อาจเหมาะสมที่จะแก้ไขความคิดเห็นของคุณดังนั้นจึงไม่ทำให้ผู้คนไม่ไว้วางใจคำตอบที่ยอมรับในปัจจุบัน?
jbyler


8

ไม่เกี่ยวข้องกับคำถามเดิมจริงๆ แต่อาจมีคนพบว่ามีประโยชน์ PermGen เป็นพื้นที่ในหน่วยความจำที่ Java ใช้เก็บคลาส ดังนั้นพวกเราหลายคนได้พบกับ OOM ใน PermGen เช่นถ้ามีหลายชั้นเรียน

ตั้งแต่ Java 8 พื้นที่ PermGen ถูกแทนที่ด้วยพื้นที่ MetaSpace ซึ่งมีประสิทธิภาพมากขึ้นและไม่ จำกัด โดยค่าเริ่มต้น (หรือแม่นยำมากขึ้น - ถูก จำกัด ด้วยจำนวนหน่วยความจำเนทีฟขึ้นอยู่กับความพร้อมใช้งานของหน่วยความจำเสมือน 32 หรือ 64 บิต jvm และ OS) อย่างไรก็ตามเป็นไปได้ที่จะปรับแต่งในบางวิธีเช่นการระบุขีด จำกัด สูงสุดสำหรับพื้นที่ คุณสามารถค้นหาข้อมูลที่เป็นประโยชน์เพิ่มเติมได้ในโพสต์บล็อกนี้




3

ถ้าจำไม่ผิด gen ย่อมาจาก generation เช่นเดียวกับคนเก็บขยะ generational (ที่ปฏิบัติกับวัตถุที่มีอายุน้อยกว่าต่างจากวัตถุในช่วงกลางชีวิตและ "ถาวร") หลักการของพื้นที่แสดงให้เห็นว่าวัตถุที่เพิ่งสร้างขึ้นจะถูกล้างออกก่อน


1

Permgen ย่อมาจาก Permanent Generation เป็นหนึ่งในพื้นที่หน่วยความจำ JVM เป็นส่วนหนึ่งของ Heap ที่มีขนาดคงที่โดยใช้แฟล็กที่เรียกว่า MaxPermSize

ทำไมถึงชื่อ PermGen?

Permgen นี้ได้รับการตั้งชื่อในยุคแรกของ Java Permgen mains เก็บข้อมูลเมตาทั้งหมดของคลาสที่โหลด แต่ปัญหาคือเมื่อโหลดคลาสแล้วจะยังคงอยู่ใน JVM จนกว่าจะปิด JVM ดังนั้นชื่อ Permgen จึงเลือกใช้ แต่ต่อมาการโหลดคลาสแบบไดนามิกกลายมาเป็นรูปภาพ แต่ไม่ได้เปลี่ยนชื่อ แต่ด้วยJava 8พวกเขาได้แก้ไขปัญหานั้นเช่นกัน ตอนนี้Permagenถูกเปลี่ยนชื่อเป็นMetaSpaceด้วยขนาดหน่วยความจำแบบไดนามิก

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