ภูมิภาคฮีปของ JVM และวงจรชีวิตออบเจ็กต์
สำรวจ Young Generation (Eden, Survivor), Old Generation และ Metaspace รวมถึงวิธีที่ออบเจ็กต์ย้ายระหว่างพื้นที่เหล่านี้
ภูมิภาคฮีปของ JVM และวงจรชีวิตออบเจ็กต์ เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
รูปแบบหน่วยความจำของ JVM
JVM แบ่งหน่วยความจำออกเป็นหลายส่วน ฮีปเก็บอินสแตนซ์ของคลาสและอาร์เรย์ทั้งหมด พื้นที่นอกฮีปได้แก่ Metaspace (ข้อมูลเมตาของคลาส) เฟรมสแตก และหน่วยความจำเนทีฟ
รุ่นอายุน้อย: พื้นที่เอเดน
ออบเจ็กต์ที่เพิ่งจัดสรรจะไปยังเอเดน เมื่อเอเดนเต็ม จะทำการเก็บขยะรอบย่อย ออบเจ็กต์ที่รอดชีวิตจะถูกคัดลอกไปยังพื้นที่ผู้รอดชีวิต
// Object allocation starts in Eden:
String s = new String("hello"); // allocated in Eden
List<Integer> list = new ArrayList<>(); // also Edenพื้นที่ผู้รอดชีวิต: S0 และ S1
พื้นที่ผู้รอดชีวิตสองแห่ง (S0 และ S1) เก็บออบเจ็กต์ที่รอดจากการเก็บขยะมาแล้วอย่างน้อยหนึ่งครั้ง ออบเจ็กต์จะสลับระหว่าง S0 และ S1 ในการเก็บขยะรอบย่อยแต่ละครั้ง ตัวนับอายุของออบเจ็กต์จะเพิ่มขึ้น
เกณฑ์การเลื่อนรุ่น
เมื่ออายุของออบเจ็กต์เกินเกณฑ์การเลื่อนรุ่น (ค่าเริ่มต้น 15) ออบเจ็กต์นั้นจะถูกเลื่อนไปยังรุ่นอายุยาว ออบเจ็กต์ขนาดใหญ่อาจข้ามรุ่นอายุสั้นและไปยังรุ่นอายุยาวโดยตรง
// JVM flags:
// -XX:MaxTenuringThreshold=15 (default)
// -XX:PretenureSizeThreshold=1m (objects > 1MB go directly to Old Gen)รุ่นอายุยาว (พื้นที่วัตถุอายุยืน)
ออบเจ็กต์อายุยืนจะอยู่ในรุ่นอายุยาว การเก็บขยะรอบใหญ่ (แบบเต็ม) จะเก็บรุ่นอายุยาวและมีค่าใช้จ่ายสูงกว่า การลดจำนวนออบเจ็กต์อายุยืนช่วยลดความถี่ของการเก็บขยะเต็มรูปแบบ
Metaspace (Java 8 ขึ้นไป)
Metaspace เข้ามาแทนที่ PermGen ใน Java 8 โดยเก็บข้อมูลเมตาของคลาส ไบต์โค้ดของเมธอด และสตริงที่ทำอินเทิร์น Metaspace ใช้หน่วยความจำเนทีฟและขยายแบบไดนามิก โดยมีขอบเขตจำกัดด้วย -XX:MaxMetaspaceSize
// Flag examples:
// -XX:MetaspaceSize=64m (initial Metaspace size)
// -XX:MaxMetaspaceSize=256m (cap to avoid native OOM)เส้นทางด่วนของการจัดสรรออบเจ็กต์
JVM ใช้บัฟเฟอร์การจัดสรรเฉพาะเธรดเพื่อจัดสรรพื้นที่จากเอเดนโดยไม่ต้องซิงโครไนซ์ แต่ละเธรดมีส่วนย่อยของเอเดนเป็นของตนเอง
วงจรชีวิตของออบเจ็กต์: การเข้าถึงได้
ออบเจ็กต์ยังมีชีวิตอยู่หากเข้าถึงได้จากรากของตัวเก็บขยะ (ตัวแปรในสแตก ฟิลด์แบบคงที่ หรือการอ้างอิง JNI) ออบเจ็กต์ที่เข้าถึงไม่ได้จะเป็นผู้สมัครสำหรับการเก็บขยะ
Object a = new Object(); // reachable via local variable
a = null; // now unreachable — eligible for GCการอ้างอิงแบบนุ่ม อ่อน และหลอน
SoftReference จะถูกล้างค่าก่อนเกิด OOM (ใช้สำหรับ Cache) WeakReference จะถูกล้างค่าในการเก็บขยะครั้งถัดไป ส่วน PhantomReference ใช้สำหรับการล้างทรัพยากรหลังออบเจ็กต์สิ้นสภาพ
Cache<String, Image> cache = new LinkedHashMap<>();
// Use SoftReference to let GC reclaim cache under memory pressure:
SoftReference<Image> ref = new SoftReference<>(loadHeavyImage());
Image img = ref.get(); // null if GC collected itการทำให้ออบเจ็กต์เสร็จสิ้น (ควรหลีกเลี่ยง)
finalize() ถูกเลิกใช้และคาดเดาไม่ได้ ตัวเก็บขยะจะเรียกใช้เมธอดนี้ก่อนเก็บออบเจ็กต์ แต่ไม่รับประกันเวลาเรียกใช้ ให้ใช้ Cleaner (Java 9 ขึ้นไป) หรือรูปแบบลองใช้แล้วปิดทรัพยากรอัตโนมัติแทน
แฟล็กกำหนดขนาดฮีป
ควบคุมฮีปด้วย -Xms (ค่าเริ่มต้น) และ -Xmx (ค่าสูงสุด) กำหนดให้ทั้งสองค่าเท่ากันในระบบจริงเพื่อหลีกเลี่ยงการหยุดจากการปรับขนาดฮีป
// Recommended production flags:
// -Xms512m -Xmx512m (fix heap to 512 MB)
// -XX:NewRatio=2 (Old:Young = 2:1)ตรวจสอบอย่างรวดเร็ว
ออบเจ็กต์ที่เพิ่งจัดสรรจะอยู่ที่ใดเป็นครั้งแรกในฮีปของ JVM
ทบทวน
ฮีปของ JVM มีรุ่นอายุสั้น (เอเดนและพื้นที่ผู้รอดชีวิต) กับรุ่นอายุยาว ออบเจ็กต์จะมีอายุเพิ่มขึ้นผ่านการเก็บขยะรอบย่อยและถูกเลื่อนไปยังรุ่นอายุยาว Metaspace เก็บข้อมูลเมตาของคลาส ควบคุมได้ด้วย -Xms/-Xmx และแฟล็กปรับแต่ง
คำถามที่พบบ่อย
บทเรียน “ภูมิภาคฮีปของ JVM และวงจรชีวิตออบเจ็กต์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ภูมิภาคฮีปของ JVM และวงจรชีวิตออบเจ็กต์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ภูมิภาคฮีปของ JVM และวงจรชีวิตออบเจ็กต์”
สำรวจ Young Generation (Eden, Survivor), Old Generation และ Metaspace รวมถึงวิธีที่ออบเจ็กต์ย้ายระหว่างพื้นที่เหล่านี้ คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “ภูมิภาคฮีปของ JVM และวงจรชีวิตออบเจ็กต์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ภูมิภาคฮีปของ JVM และวงจรชีวิตออบเจ็กต์
- อัลกอริทึม GC: Serial, G1, ZGC, Shenandoah
- การตรวจจับและแก้ไขหน่วยความจำรั่ว
- แฟล็กปรับแต่ง GC และการทำโปรไฟล์ด้วย JVisualVM