การเก็บขยะคืออะไร

การรวบรวมขยะสามารถกำหนดเป็นกระบวนการทำลายหรือยกเลิกการกำหนดวัตถุหรือตัวแปรที่ไม่ได้ใช้ (ไม่ได้ใช้) ภายในหน่วยความจำซึ่งจะสร้างหน่วยความจำว่าง

เหตุใดจึงสำคัญ

ในฐานะมือใหม่ คุณอาจมองข้ามความสำคัญของการรวบรวมขยะในตอนแรก แต่คุณต้องดูแลมันจริงๆ เมื่อคุณเริ่มสร้างโปรเจ็กต์ที่ปรับขนาดได้ระดับไฮเอนด์ ซึ่งคุณอาจจัดการกับคำขอนับล้าน และตอนนี้คุณต้องจัดการหน่วยความจำของคุณอย่างมีประสิทธิภาพ ไม่อย่างนั้น คุณอาจต้องจ่ายเงินเพิ่มขึ้นเพื่อใช้บริการและเว็บไซต์และแอปที่มีประสิทธิภาพน้อยลง

ข้อเท็จจริงบางประการ:-

หากคุณเคยทำงานในภาษา C หรือ C++ คุณอาจทราบว่าภาษาเหล่านี้ไม่มีระบบรวบรวมขยะอัตโนมัติ ถูกต้องแล้ว คุณจะต้องติดตามโครงสร้าง วัตถุ และตัวแปรด้วยตนเอง และทำลายทิ้งเมื่อไม่ได้ใช้งาน

ใน C หรือ C++ เราได้พบกับฟังก์ชันที่เรียกว่า:- free() ซึ่งมีหน้าที่ในการสร้างหน่วยความจำว่าง

โชคดีที่ Javascript และการเขียนโปรแกรมระดับสูงอื่นๆ มีการรวบรวมขยะอัตโนมัติ และคุณไม่ต้องกังวลกับวัตถุและตัวแปรที่ไม่ได้ใช้ ด้านสว่างด้านล่างคือเทคนิคที่ใช้โดยการเก็บขยะอัตโนมัติของ Javscript

เทคนิคที่ใช้โดยตัวรวบรวมขยะอัตโนมัติ Javascript:-

  1. การรวบรวม Grabage สำหรับการนับอ้างอิง:-

เทคนิคนี้ใช้หลักการง่ายๆ ในการนับจำนวนการอ้างอิงที่วัตถุมี

ตัวอย่าง:-

นักเรียน var = { id : 2 ชื่อ: Michael }

var copy_data = Student // copy_data เก็บข้อมูลอ็อบเจ็กต์ของนักเรียนในขณะนี้ ดังนั้นจำนวนการอ้างอิงจึงเป็น 2

นักเรียน = null // นักเรียนกำหนดให้เป็น null แต่ copy_data ยังคงชี้ไปที่วัตถุ ดังนั้นตัวนับอ้างอิงจึงเป็น 1 ในขณะนี้

var Student_name = Student.name // Student_name ตอนนี้เก็บการอ้างอิงถึงหนึ่งในตัวแปรของวัตถุ ดังนั้นจำนวนการอ้างอิงจึงถูกตั้งค่าเป็น 2 อีกครั้ง

copy_data = null // ตัวนับอ้างอิงตั้งค่าเป็น 1 ทันที

Student_name = null // ตัวนับอ้างอิงถูกตั้งค่าเป็น 0 ดังนั้นจึงมีสิทธิ์สำหรับการรวบรวมขยะ

ปัญหาเกี่ยวกับเทคนิคการนับการอ้างอิง:-

ปัญหานี้เกิดขึ้นกับเทคนิคนี้เมื่อมีสภาวะการหยุดชะงัก (ปัญหาวงจร) โดยที่วัตถุหนึ่งชี้ไปยังวัตถุอื่นและในทางกลับกันก็ชี้ไปที่วัตถุแรก

ตัวอย่าง:-

ฟังก์ชัน ฉ () {

นักเรียน var = { id : S288, course_instructors : null}

ครู var = { id : P1001, list_of_students: null}

Student.course_instructors = นักเรียน.หลักสูตร_instructors.append(teacher.id)

teacher.list_of_students = teacher.list_of_students.append(student.id)

}

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

2. อัลกอริทึมการทำเครื่องหมายและกวาด:-

อัลกอริธึมนี้จะลดคำจำกัดความของ "ไม่จำเป็นต้องใช้วัตถุอีกต่อไป" เป็น "ไม่สามารถเข้าถึงวัตถุได้"

อัลกอริทึมนี้ถือว่าความรู้เกี่ยวกับชุดของวัตถุที่เรียกว่า ราก ใน JavaScript รากคือวัตถุส่วนกลาง ตัวรวบรวมขยะจะเริ่มต้นจากรากเหล่านี้ ค้นหาวัตถุทั้งหมดที่อ้างอิงมาจากรากเหล่านี้ จากนั้นจึงวัตถุทั้งหมดที่อ้างอิงมาจากรากเหล่านี้ เริ่มต้นจากราก ผู้รวบรวมขยะจะค้นหาวัตถุที่สามารถเข้าถึงได้ทั้งหมด และรวบรวมวัตถุที่ไม่สามารถเข้าถึงได้ทั้งหมด

ปัญหาวงจรได้รับการแก้ไขด้วยเทคนิคนี้ เนื่องจากหลังจากการเรียกใช้ฟังก์ชันส่งคืน ออบเจ็กต์ทั้งสองจะไม่ถูกอ้างอิงโดยทรัพยากรใดๆ ที่สามารถเข้าถึงได้จากออบเจ็กต์โกลบอลอีกต่อไป

หากคุณชอบแนวคิดเล็กๆ น้อยๆ นี้ ก็ปรบมือ ขอให้มีวันดีๆ นะ!