Perm Space คืออะไร?


88

ในขณะที่เรียนรู้เกี่ยวกับการสร้างโปรไฟล์หน่วยความจำ java ฉันยังคงเห็นคำว่า "perm space" นอกเหนือจาก "heap" ฉันรู้ว่าฮีปคืออะไร - พื้นที่อนุญาตคืออะไร?


13
Java 8 ได้ลบแนวคิดนี้โดยสิ้นเชิงและย้ายไปที่ Metaspace
pramodc84

2
อ้างอิงอธิบายได้ดีที่นี่youtube.com/watch?v=PUUJ4rNpRhU
shareef

คำตอบ:


103

ย่อมาจากการสร้างแบบถาวร :

การสร้างแบบถาวรมีความพิเศษเนื่องจากมีข้อมูลเมตาที่อธิบายคลาสผู้ใช้ (คลาสที่ไม่ได้เป็นส่วนหนึ่งของภาษา Java) ตัวอย่างของข้อมูลเมตาดังกล่าวเป็นอ็อบเจ็กต์ที่อธิบายคลาสและเมธอดและถูกเก็บไว้ในการสร้างแบบถาวร แอปพลิเคชั่นที่มีรหัสฐานขนาดใหญ่สามารถเติมส่วนนี้ของฮีปได้อย่างรวดเร็วซึ่งจะทำให้เกิด java.lang.OutOfMemoryError: PermGen ไม่ว่าคุณจะ -Xmx สูงแค่ไหนและคุณมีหน่วยความจำในเครื่องมากแค่ไหน


Andrew ฉันแค่อยากรู้ว่า PerGen มีขนาดเท่าไหร่?
gks

เพียงแค่อยากรู้ว่า permgen เป็นส่วนหนึ่งของหน่วยความจำฮีป (ตามที่ระบุไว้ในคำตอบนี้) หรือเป็น off-heap (ตามที่ระบุไว้ในคำตอบนี้ - stackoverflow.com/a/31103100/3061686 )
akki

26

Perm spaceใช้เพื่อเก็บข้อมูลสำหรับคลาสที่โหลดและคุณสมบัติขั้นสูงอื่น ๆ เช่นString Pool(สำหรับการทดสอบความเท่าเทียมกันของสตริงที่ปรับให้เหมาะสมที่สุด) ซึ่งโดยปกติจะสร้างขึ้นโดยString.intern()วิธีการ เนื่องจากแอปพลิเคชันของคุณ (จำนวนชั้นเรียน) จะเพิ่มขึ้นพื้นที่นี้จะเต็มอย่างรวดเร็วเนื่องจากการรวบรวมขยะใน Space นี้ไม่ค่อยมีประสิทธิภาพในการทำความสะอาดตามที่ต้องการคุณจะออกจากหน่วยความจำได้อย่างรวดเร็ว: ข้อผิดพลาดเกี่ยวกับพื้นที่ perm gen หลังจากนั้นจะไม่มีแอปพลิเคชันใดทำงานบนเครื่องนั้นได้อย่างมีประสิทธิภาพแม้ว่าจะมี JVM ว่างเปล่าขนาดใหญ่ก็ตาม

ก่อนที่จะเริ่มแอปพลิเคชันของคุณคุณควรjava -XX:MaxPermSizeกำจัดข้อผิดพลาดนี้


String pool เปลี่ยนเป็น heap space ตั้งแต่ java 7
Caffeine Coder

20

คำตอบง่ายๆ (และย่อขนาด): เป็นที่ที่ jvm เก็บข้อมูลการทำบัญชีของตัวเองเมื่อเทียบกับข้อมูลของคุณ


17

Perm Gen ย่อมาจากการสร้างแบบถาวรซึ่งเก็บข้อมูลเมตาดาต้าเกี่ยวกับคลาส

  1. สมมติว่าคุณสร้างชื่อคลาส A ตัวแปรอินสแตนซ์จะถูกเก็บไว้ในหน่วยความจำฮีปและคลาส A พร้อมกับคลาสตัวโหลดแบบคงที่จะถูกเก็บไว้ในรุ่นถาวร
  2. นักเก็บขยะจะพบว่าเป็นการยากที่จะล้างหรือเพิ่มพื้นที่หน่วยความจำที่เก็บไว้ในหน่วยความจำรุ่นถาวร ดังนั้นจึงขอแนะนำให้รักษาการตั้งค่าหน่วยความจำที่อนุญาตให้อยู่ในขีด จำกัด ที่แนะนำเสมอ
  3. JAVA8 ได้นำเสนอแนวคิดที่เรียกว่า meta-space generation ดังนั้นจึงไม่จำเป็นต้องใช้ permgen อีกต่อไปเมื่อคุณใช้ jdk 1.8 เวอร์ชัน

5

พื้นที่ Permgen คือพื้นที่ของฮีปที่เก็บข้อมูลสะท้อนแสงทั้งหมดของเครื่องเสมือนเช่นคลาสและวัตถุวิธีการ


3

มันมีคำจำกัดความของคลาสสตริงพูล ฯลฯ ฉันเดาว่าคุณสามารถเรียกมันว่าข้อมูลเมตา


3

พื้นที่ Permgen เรียกว่าพื้นที่วิธีการเสมอเมื่อระบบย่อย classloader จะโหลดไฟล์คลาส (รหัสไบต์) ไปยังพื้นที่วิธีการ (permGen) มันมีข้อมูลเมตาของคลาสทั้งหมดเช่นชื่อแบบเต็มของคลาสของคุณชื่อแบบเต็มของคลาสพาเรนต์ข้อมูลตัวแปรข้อมูลคอนสตรัคเตอร์อินฟอร์พูลคงที่เป็นต้น


2

สิ่งที่อยู่ภายใต้ PremGen: Class Area อยู่ภายใต้พื้นที่ PremGen ฟิลด์แบบคงที่ได้รับการพัฒนาในเวลาโหลดคลาสดังนั้นจึงมีอยู่ใน PremGen ด้วย พื้นที่ Constant Pool ที่มีเขตข้อมูลที่ไม่เปลี่ยนรูปทั้งหมดที่รวมกันเช่น String จะถูกเก็บไว้ที่นี่ นอกจากนั้นข้อมูลคลาสที่โหลดโดยตัวโหลดคลาสอาร์เรย์อ็อบเจ็กต์ภายในที่ใช้โดย jvm ก็อยู่ด้วย


1

PermGen Space ย่อมาจากการจัดสรรหน่วยความจำสำหรับการสร้างแบบถาวรวัตถุที่ไม่เปลี่ยนรูปของ Java ทั้งหมดอยู่ภายใต้หมวดหมู่นี้Stringซึ่งสร้างขึ้นด้วยตัวอักษรหรือด้วยString.intern()วิธีการและสำหรับการโหลดคลาสลงในหน่วยความจำ PermGen Space เพิ่มความเร็วในการค้นหาความเท่าเทียมกันของสตริงของเรา


1
  • JVM มีการแสดงออบเจ็กต์ Java ภายในและการแสดงภายในเหล่านั้นจะถูกเก็บไว้ในฮีป (ในคนรุ่นใหม่หรือรุ่นที่ดำรงตำแหน่ง)
  • JVM ยังมีการแสดงภายในของคลาส Java และจะถูกเก็บไว้ในรุ่นถาวร

ใส่คำอธิบายภาพที่นี่

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