วิธีการคงที่ (ในความเป็นจริงทุกวิธี) รวมทั้งตัวแปรคงถูกเก็บไว้ในPermGen
ส่วนของฮีปเนื่องจากเป็นส่วนหนึ่งของข้อมูลการสะท้อน (ข้อมูลที่เกี่ยวข้องกับคลาสไม่เกี่ยวข้องกับอินสแตนซ์)
อัปเดตเพื่อชี้แจง :
โปรดทราบว่าเฉพาะตัวแปรและค่าทางเทคนิค (ดั้งเดิมหรือการอ้างอิง) เท่านั้นที่ถูกเก็บไว้ในพื้นที่ PermGen
หากตัวแปรคงที่ของคุณเป็นการอ้างอิงถึงอ็อบเจกต์ที่อ็อบเจ็กต์นั้นถูกเก็บไว้ในส่วนปกติของฮีป (คนรุ่นใหม่ / รุ่นเก่าหรือพื้นที่ผู้รอดชีวิต) อ็อบเจ็กต์เหล่านั้น (ยกเว้นว่าเป็นอ็อบเจ็กต์ภายในเช่นคลาส ฯลฯ ) จะไม่ถูกเก็บไว้ในพื้นที่ PermGen
ตัวอย่าง:
static int i = 1; //the value 1 is stored in the PermGen section
static Object o = new SomeObject(); //the reference(pointer/memory address) is stored in the PermGen section, the object itself is not.
คำเกี่ยวกับการเก็บขยะ:
ไม่ได้พึ่งพาfinalize()
เป็นก็ไม่รับประกันว่าจะวิ่ง JVM ขึ้นอยู่กับ JVM ในการตัดสินใจว่าจะรันตัวเก็บขยะเมื่อใดและจะรวบรวมอะไรแม้ว่าอ็อบเจ็กต์จะมีสิทธิ์ได้รับการรวบรวมขยะก็ตาม
แน่นอนคุณสามารถตั้งค่าตัวแปรแบบคงที่เป็น null และลบการอ้างอิงไปยังอ็อบเจ็กต์บนฮีปได้ แต่นั่นไม่ได้หมายความว่าตัวรวบรวมขยะจะรวบรวมมัน (แม้ว่าจะไม่มีการอ้างอิงเพิ่มเติมก็ตาม)
นอกจากนี้finalize()
ยังเรียกใช้เพียงครั้งเดียวดังนั้นคุณต้องตรวจสอบให้แน่ใจว่าไม่ได้ทิ้งข้อยกเว้นหรือป้องกันไม่ให้รวบรวมวัตถุ หากคุณหยุดการสรุปผลผ่านข้อยกเว้นบางอย่างfinalize()
จะไม่มีการเรียกใช้วัตถุเดียวกันอีกเป็นครั้งที่สอง
หมายเหตุสุดท้าย : วิธีการจัดเก็บโค้ดข้อมูลรันไทม์ ฯลฯ ขึ้นอยู่กับ JVM ที่ใช้กล่าวคือ HotSpot อาจทำแตกต่างจาก JRockit และสิ่งนี้อาจแตกต่างกันไประหว่างเวอร์ชันของ JVM เดียวกัน ข้างต้นอ้างอิงจาก HotSpot สำหรับ Java 5 และ 6 (โดยพื้นฐานแล้วจะเหมือนกัน) ตั้งแต่ตอนที่ตอบฉันบอกว่าคนส่วนใหญ่ใช้ JVM เหล่านั้น เนื่องจากการเปลี่ยนแปลงที่สำคัญในโมเดลหน่วยความจำ ณ Java 8 ข้อความข้างต้นอาจไม่เป็นจริงสำหรับ Java 8 HotSpot - และฉันไม่ได้ตรวจสอบการเปลี่ยนแปลงของ Java 7 HotSpot ดังนั้นฉันเดาว่าข้างต้นยังคงเป็นจริงสำหรับเวอร์ชันนั้น แต่ฉันไม่แน่ใจที่นี่