การอนุญาต PermGen ใน JDK 8


229

ฉันติดตั้ง JDK 8 แล้วและพยายามเรียกใช้ Eclipse ฉันได้รับข้อความเตือนต่อไปนี้:

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512m;
support was removed in 8.0 

อะไรคือสาเหตุของการเพิกเฉยตัวเลือก VM นี้?


4
คุณอาจพบข้อมูลนี้: javaeesupportpatterns.blogspot.co.uk/2013/02/…
Andrew Martin

คำตอบ:


358

เหตุผลที่เพิกเฉยต่อข้อโต้แย้งเหล่านี้คือการสร้างแบบถาวรถูกลบออกใน HotSpot สำหรับ JDK8 เนื่องจากข้อเสียดังต่อไปนี้

  • ขนาดคงที่เมื่อเริ่มต้น - ปรับแต่งยาก
  • ประเภทฮอตสปอตภายในเป็นวัตถุ Java: สามารถย้ายได้ด้วย GC แบบทึบทึบไม่พิมพ์อย่างรุนแรงและยากที่จะดีบักจำเป็นต้องใช้เมตาดาต้า
  • ลดความซับซ้อนของคอลเล็กชันเต็ม: ตัววนซ้ำพิเศษสำหรับข้อมูลเมตาสำหรับตัวสะสมแต่ละตัว
  • ต้องการยกเลิกการจัดสรรข้อมูลคลาสพร้อมกันและไม่ใช่ระหว่างการหยุด GC ชั่วคราว
  • เปิดใช้งานการปรับปรุงในอนาคตที่ถูก จำกัด โดย PermGen

พื้นที่สร้างถาวร (PermGen) ได้ถูกลบออกอย่างสมบูรณ์และถูกแทนที่ด้วยพื้นที่ใหม่ที่เรียกว่า Metaspace ผลที่ตามมาของการลบ PermGen คือข้อโต้แย้ง PermSize และ MaxPermSize JVM จะถูกละเว้นและคุณจะไม่ได้รับข้อผิดพลาด java.lang.OutOfMemoryError: PermGen

ข้อดีของ MetaSpace

  • ใช้ประโยชน์จากคุณสมบัติ Java Language Specification: คลาสและอายุข้อมูลเมตาที่เชื่อมโยงจับคู่คลาสโหลดเดอร์
  • พื้นที่สำหรับเก็บข้อมูลต่อโหลด - Metaspace
  • การจัดสรรเชิงเส้นเท่านั้น
  • ไม่มีการเรียกคืนแต่ละรายการ (ยกเว้น RedefineClasses และการโหลดคลาสล้มเหลว)
  • ไม่มีการสแกน GC หรือการบดอัด
  • ไม่มีการย้ายตำแหน่งสำหรับวัตถุ metaspace

การปรับ Metaspace

ขนาด metaspace สูงสุดสามารถตั้งค่าได้โดยใช้แฟล็ก -XX: MaxMetaspaceSize และค่าดีฟอลต์คือไม่ จำกัด ซึ่งหมายความว่ามีเพียงหน่วยความจำระบบของคุณเท่านั้น แฟล็กการปรับ -XX: MetaspaceSize กำหนดขนาดเริ่มต้นของ metaspace หากคุณไม่ระบุแฟล็กนี้ Metaspace จะปรับขนาดแบบไดนามิกขึ้นอยู่กับความต้องการของแอปพลิเคชันที่รันไทม์

การเปลี่ยนแปลงช่วยให้การเพิ่มประสิทธิภาพและคุณสมบัติอื่น ๆ ในอนาคต

  • การแชร์ข้อมูลระดับแอปพลิเคชัน
  • การเพิ่มประสิทธิภาพการรวบรวมหนุ่มสาว, การปลดคลาส G1
  • การลดขนาดข้อมูลเมตาและโครงการรอยเท้าภายใน JVM

ยังมีการปรับปรุงสมรรถนะของ GC อีกด้วย รายละเอียดเพิ่มเติม


29
ฉันควรจะพูดถึงว่าสตริงฝึกงานถูกเก็บไว้ก่อนหน้านี้ในพื้นที่ PermGen แต่ถูกย้ายไปอยู่ที่กอง Java หลักใน Java 7
gparyani

ขอบคุณสำหรับคำอธิบายโดยละเอียด
Pradeep

3
การแนะนำเล็กน้อยสำหรับผู้ชมทั่วไป (ฉันหมายถึงคนที่ไม่ใช่จาวาส่วนใหญ่เช่นเพื่อนที่ต้องรับมือกับ JVM) จะไม่เป็นอันตรายต่อคำตอบนี้
ulidtko

117

นี่เป็นหนึ่งในคุณสมบัติใหม่ของ Java 8 ซึ่งเป็นส่วนหนึ่งของข้อเสนอการปรับปรุง JDK 122 :

ลบการสร้างถาวรจาก Hotspot JVM และทำให้จำเป็นต้องปรับขนาดของการสร้างถาวร

รายการ JEPs ทั้งหมดที่จะถูกรวมอยู่ใน Java 8 ที่สามารถพบได้ในJDK8 เหตุการณ์สำคัญหน้า


19

พื้นที่ถาวรรุ่น (PermGen) ได้ถูกลบออกอย่างสมบูรณ์และถูกแทนที่ด้วยพื้นที่ใหม่ที่เรียกว่า Metaspace ผลที่ตามมาของการกำจัด PermGen คือข้อโต้แย้งที่ชัดเจนว่า PermSize และ MaxPermSize JVM จะไม่ได้รับและคุณจะไม่ได้รับjava.lang.OutOfMemoryErrorข้อผิดพลาด PermGen JDK 8 HotSpot JVM กำลังใช้หน่วยความจำดั้งเดิมสำหรับการแสดงข้อมูลเมตาของคลาสและเรียกว่า Metaspace อ่านเพิ่มเติม >>


3
'HotSpot JVM กำลังใช้หน่วยความจำดั้งเดิมเพื่อเป็นตัวแทนของข้อมูลเมตาของคลาส - และ HotSpot JVM ใช้หน่วยความจำแบบใดมาก่อน และหน่วยความจำดั้งเดิมคืออะไร
Andrey M. Stepanov


12

พื้นที่ PermGen ถูกแทนที่ด้วย MetaSpace ใน Java 8 อาร์กิวเมนต์ PermSize และ MaxPermSize JVM จะถูกละเว้นและจะมีการเตือนหากมีการแจ้งเตือนเมื่อเริ่มต้นระบบ

การจัดสรรส่วนใหญ่สำหรับข้อมูลเมตาของคลาสจะถูกจัดสรรออกจากหน่วยความจำดั้งเดิม * คลาสที่ใช้เพื่ออธิบายข้อมูลเมตาของคลาสได้ถูกลบออก

ความแตกต่างที่สำคัญระหว่าง PermGen เก่ากับ MetaSpace ใหม่คือคุณไม่จำเป็นต้องกำหนดขีด จำกัด สูงสุดของการใช้หน่วยความจำ คุณสามารถ จำกัด ขอบเขตของ MetaSpace ได้ ดังนั้นเมื่อการใช้หน่วยความจำเพิ่มขึ้นคุณจะไม่ได้รับข้อผิดพลาด OutOfMemoryError แต่หน่วยความจำดั้งเดิมที่สงวนไว้จะถูกเพิ่มเป็นการเติมการใช้งานหน่วยความจำเพิ่มให้เต็ม

คุณสามารถกำหนดขีด จำกัด สูงสุดของพื้นที่สำหรับ MetaSpace แล้วมันจะโยน OutOfMemoryError: Metadata space ดังนั้นจึงเป็นสิ่งสำคัญที่จะต้องกำหนดขีด จำกัด นี้อย่างระมัดระวังเพื่อให้เราสามารถหลีกเลี่ยงการสูญเสียความจำ


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