Java Virtual Machine - การรวบรวมขยะ
วงจรชีวิตของอ็อบเจ็กต์ Java ถูกจัดการโดย JVM เมื่อโปรแกรมสร้างอ็อบเจ็กต์ขึ้นมาแล้วเราไม่จำเป็นต้องกังวลเกี่ยวกับอายุการใช้งานที่เหลือ JVM จะค้นหาวัตถุที่ไม่ได้ใช้งานอีกต่อไปโดยอัตโนมัติและเรียกคืนหน่วยความจำจากฮีป
การเก็บขยะเป็นการดำเนินการหลักที่ JVM ทำและปรับแต่งตามความต้องการของเราสามารถเพิ่มประสิทธิภาพให้กับแอปพลิเคชันของเราได้มาก มีอัลกอริธึมการรวบรวมขยะที่หลากหลายซึ่งจัดเตรียมโดย JVM สมัยใหม่ เราต้องตระหนักถึงความต้องการของแอปพลิเคชันของเราเพื่อตัดสินใจว่าจะใช้อัลกอริทึมใด
คุณไม่สามารถยกเลิกการจัดสรรอ็อบเจ็กต์โดยใช้โปรแกรมใน Java ได้เช่นเดียวกับที่ทำได้ในภาษาที่ไม่ใช่ GC เช่น C และ C ++ ดังนั้นคุณไม่สามารถมีการอ้างอิงห้อยใน Java อย่างไรก็ตามคุณอาจมีการอ้างอิงที่เป็นโมฆะ (การอ้างอิงที่อ้างถึงพื้นที่ของหน่วยความจำที่ JVM จะไม่เก็บวัตถุ) เมื่อใดก็ตามที่ใช้การอ้างอิง null JVM จะพ่น NullPointerException
โปรดทราบว่าแม้ว่าจะไม่ค่อยพบการรั่วไหลของหน่วยความจำในโปรแกรม Java เนื่องจาก GC แต่ก็เกิดขึ้นได้ เราจะสร้างการรั่วไหลของความทรงจำในตอนท้ายของบทนี้
GC ต่อไปนี้ใช้ใน JVM สมัยใหม่
- ตัวเก็บอนุกรม
- ตัวรวบรวมปริมาณงาน
- ตัวรวบรวม CMS
- นักสะสม G1
แต่ละอัลกอริทึมข้างต้นทำงานเหมือนกัน - ค้นหาวัตถุที่ไม่ได้ใช้งานอีกต่อไปและเรียกคืนหน่วยความจำที่ครอบครองในฮีป หนึ่งในวิธีการที่ไร้เดียงสาในการนี้คือการนับจำนวนการอ้างอิงที่แต่ละออบเจ็กต์มีและทำให้เป็นอิสระทันทีที่จำนวนการอ้างอิงเปลี่ยนเป็น 0 (เรียกอีกอย่างว่าการนับการอ้างอิง) ทำไมไร้เดียงสาขนาดนี้ พิจารณารายการที่เชื่อมโยงแบบวงกลม แต่ละโหนดจะมีการอ้างอิงถึง แต่อ็อบเจ็กต์ทั้งหมดไม่ได้รับการอ้างอิงจากที่ใดก็ตามและควรเป็นอิสระ
JVM ไม่เพียง แต่ปลดปล่อยหน่วยความจำเท่านั้น แต่ยังรวมหน่วยความจำขนาดเล็กเข้าด้วยกันเป็นหน่วยความจำที่ใหญ่ขึ้น สิ่งนี้ทำเพื่อป้องกันการกระจายตัวของหน่วยความจำ
ในข้อสังเกตง่ายๆอัลกอริทึม GC ทั่วไปทำกิจกรรมต่อไปนี้ -
- ค้นหาวัตถุที่ไม่ได้ใช้
- ปลดปล่อยความทรงจำที่พวกเขาครอบครองในกอง
- การรวมชิ้นส่วน
GC ต้องหยุดเธรดของแอปพลิเคชันในขณะที่กำลังทำงานอยู่ เนื่องจากมันเคลื่อนย้ายวัตถุไปรอบ ๆ เมื่อมันทำงานดังนั้นจึงไม่สามารถใช้วัตถุเหล่านั้นได้ การหยุดดังกล่าวเรียกว่า 'หยุดโลกหยุดชั่วคราวและลดความถี่และระยะเวลาของการหยุดชั่วคราวเหล่านี้เป็นสิ่งที่เราตั้งเป้าไว้ในขณะที่ปรับ GC ของเรา
การรวมหน่วยความจำ
การสาธิตการรวมหน่วยความจำอย่างง่ายแสดงไว้ด้านล่าง
ส่วนที่แรเงาเป็นวัตถุที่ต้องการปลดปล่อย แม้ว่าจะเรียกคืนพื้นที่ทั้งหมดแล้วเราสามารถจัดสรรออบเจ็กต์ที่มีขนาดสูงสุด = 75Kb เท่านั้น นี่คือแม้ว่าเราจะมีพื้นที่ว่าง 200Kb ตามที่แสดงด้านล่าง