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 ตามที่แสดงด้านล่าง