ในขณะที่เรียนรู้เกี่ยวกับการสร้างโปรไฟล์หน่วยความจำ java ฉันยังคงเห็นคำว่า "perm space" นอกเหนือจาก "heap" ฉันรู้ว่าฮีปคืออะไร - พื้นที่อนุญาตคืออะไร?
ในขณะที่เรียนรู้เกี่ยวกับการสร้างโปรไฟล์หน่วยความจำ java ฉันยังคงเห็นคำว่า "perm space" นอกเหนือจาก "heap" ฉันรู้ว่าฮีปคืออะไร - พื้นที่อนุญาตคืออะไร?
คำตอบ:
ย่อมาจากการสร้างแบบถาวร :
การสร้างแบบถาวรมีความพิเศษเนื่องจากมีข้อมูลเมตาที่อธิบายคลาสผู้ใช้ (คลาสที่ไม่ได้เป็นส่วนหนึ่งของภาษา Java) ตัวอย่างของข้อมูลเมตาดังกล่าวเป็นอ็อบเจ็กต์ที่อธิบายคลาสและเมธอดและถูกเก็บไว้ในการสร้างแบบถาวร แอปพลิเคชั่นที่มีรหัสฐานขนาดใหญ่สามารถเติมส่วนนี้ของฮีปได้อย่างรวดเร็วซึ่งจะทำให้เกิด
java.lang.OutOfMemoryError
: PermGen ไม่ว่าคุณจะ -Xmx สูงแค่ไหนและคุณมีหน่วยความจำในเครื่องมากแค่ไหน
Perm space
ใช้เพื่อเก็บข้อมูลสำหรับคลาสที่โหลดและคุณสมบัติขั้นสูงอื่น ๆ เช่นString Pool
(สำหรับการทดสอบความเท่าเทียมกันของสตริงที่ปรับให้เหมาะสมที่สุด) ซึ่งโดยปกติจะสร้างขึ้นโดยString.intern()
วิธีการ เนื่องจากแอปพลิเคชันของคุณ (จำนวนชั้นเรียน) จะเพิ่มขึ้นพื้นที่นี้จะเต็มอย่างรวดเร็วเนื่องจากการรวบรวมขยะใน Space นี้ไม่ค่อยมีประสิทธิภาพในการทำความสะอาดตามที่ต้องการคุณจะออกจากหน่วยความจำได้อย่างรวดเร็ว: ข้อผิดพลาดเกี่ยวกับพื้นที่ perm gen หลังจากนั้นจะไม่มีแอปพลิเคชันใดทำงานบนเครื่องนั้นได้อย่างมีประสิทธิภาพแม้ว่าจะมี JVM ว่างเปล่าขนาดใหญ่ก็ตาม
ก่อนที่จะเริ่มแอปพลิเคชันของคุณคุณควรjava -XX:MaxPermSize
กำจัดข้อผิดพลาดนี้
คำตอบง่ายๆ (และย่อขนาด): เป็นที่ที่ jvm เก็บข้อมูลการทำบัญชีของตัวเองเมื่อเทียบกับข้อมูลของคุณ
Perm Gen ย่อมาจากการสร้างแบบถาวรซึ่งเก็บข้อมูลเมตาดาต้าเกี่ยวกับคลาส
พื้นที่ Permgen คือพื้นที่ของฮีปที่เก็บข้อมูลสะท้อนแสงทั้งหมดของเครื่องเสมือนเช่นคลาสและวัตถุวิธีการ
มันมีคำจำกัดความของคลาสสตริงพูล ฯลฯ ฉันเดาว่าคุณสามารถเรียกมันว่าข้อมูลเมตา
พื้นที่ Permgen เรียกว่าพื้นที่วิธีการเสมอเมื่อระบบย่อย classloader จะโหลดไฟล์คลาส (รหัสไบต์) ไปยังพื้นที่วิธีการ (permGen) มันมีข้อมูลเมตาของคลาสทั้งหมดเช่นชื่อแบบเต็มของคลาสของคุณชื่อแบบเต็มของคลาสพาเรนต์ข้อมูลตัวแปรข้อมูลคอนสตรัคเตอร์อินฟอร์พูลคงที่เป็นต้น
สิ่งที่อยู่ภายใต้ PremGen: Class Area อยู่ภายใต้พื้นที่ PremGen ฟิลด์แบบคงที่ได้รับการพัฒนาในเวลาโหลดคลาสดังนั้นจึงมีอยู่ใน PremGen ด้วย พื้นที่ Constant Pool ที่มีเขตข้อมูลที่ไม่เปลี่ยนรูปทั้งหมดที่รวมกันเช่น String จะถูกเก็บไว้ที่นี่ นอกจากนั้นข้อมูลคลาสที่โหลดโดยตัวโหลดคลาสอาร์เรย์อ็อบเจ็กต์ภายในที่ใช้โดย jvm ก็อยู่ด้วย
PermGen Space ย่อมาจากการจัดสรรหน่วยความจำสำหรับการสร้างแบบถาวรวัตถุที่ไม่เปลี่ยนรูปของ Java ทั้งหมดอยู่ภายใต้หมวดหมู่นี้String
ซึ่งสร้างขึ้นด้วยตัวอักษรหรือด้วยString.intern()
วิธีการและสำหรับการโหลดคลาสลงในหน่วยความจำ PermGen Space เพิ่มความเร็วในการค้นหาความเท่าเทียมกันของสตริงของเรา