พื้นฐานตัวเก็บขยะของ Lua
ทำความเข้าใจการทำงานของ GC แบบเพิ่มทีละน้อยใน Lua ได้แก่ การทำเครื่องหมายและกวาดล้าง ค่าขีดจำกัด และ collectgarbage()
พื้นฐานตัวเก็บขยะของ Lua เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
การเก็บขยะคืออะไร
Lua ใช้ตัวเก็บขยะอัตโนมัติเพื่อนำหน่วยความจำที่ออบเจ็กต์ (ตาราง สตริง และคลอเชอร์) ซึ่งไม่สามารถเข้าถึงได้จากรากใด ๆ กลับมาใช้ใหม่
อัลกอริทึมทำเครื่องหมายและกวาด
ตัวเก็บขยะของ Lua ใช้อัลกอริทึมทำเครื่องหมายและกวาดแบบเพิ่มทีละน้อย โดยจะทำเครื่องหมายออบเจ็กต์ที่เข้าถึงได้ทั้งหมดจากราก แล้วกวาด (คืนหน่วยความจำของ) ออบเจ็กต์ที่ไม่มีเครื่องหมาย
การเก็บขยะแบบเพิ่มทีละน้อย
ตัวเก็บขยะจะทำงานทีละส่วนเล็ก ๆ สลับไปกับการทำงานของโปรแกรม วิธีนี้ช่วยหลีกเลี่ยงช่วงหยุดทำงานที่ยาวนาน ปริมาณงานในแต่ละส่วนควบคุมด้วยพารามิเตอร์ ขั้นของตัวเก็บขยะ
ฟังก์ชัน collectgarbage
collectgarbage(opt, arg) ใช้ควบคุมตัวเก็บขยะโดยตรง
collectgarbage("collect") -- run a full GC cycle
collectgarbage("stop") -- stop automatic GC
collectgarbage("restart") -- restart automatic GC
print(collectgarbage("count")) -- KB of memory in useพารามิเตอร์ของตัวเก็บขยะ
collectgarbage("setpause", n) กำหนดช่วงพักระหว่างรอบการเก็บขยะ (200 = ใช้หน่วยความจำเพิ่มเป็นสองเท่าก่อนเริ่มรอบถัดไป) ส่วน "setstepmul" ควบคุมความเร็วของตัวเก็บขยะ
collectgarbage("setpause", 200) -- default
collectgarbage("setstepmul", 200) -- defaultการอ้างอิงแบบอ่อนและตัวเก็บขยะ
โดยปกติการอ้างอิงจะทำให้ออบเจ็กต์ยังคงอยู่ แต่การอ้างอิงแบบอ่อนไม่เป็นเช่นนั้น ตัวเก็บขยะสามารถเก็บออบเจ็กต์ได้แม้ว่าจะมีตารางแบบอ่อนชี้ไปยังออบเจ็กต์นั้น
ตัวเก็บขยะแบบแยกรุ่น (Lua 5.4)
Lua 5.4 เพิ่มโหมดตัวเก็บขยะแบบแยกรุ่นที่เลือกใช้ได้ ออบเจ็กต์ใหม่จะถูกเก็บบ่อยครั้ง ส่วนออบเจ็กต์เก่าจะถูกเก็บนาน ๆ ครั้ง สลับโหมดด้วย collectgarbage("generational")
ตัวกระตุ้นการใช้หน่วยความจำสูง
ตัวเก็บขยะจะทำงานโดยอัตโนมัติเมื่อการใช้หน่วยความจำเกินค่าเกณฑ์ (กำหนดโดย pause) การสร้างตารางชั่วคราวจำนวนมากจะเพิ่มภาระให้ตัวเก็บขยะและอาจทำให้โปรแกรมทำงานช้าลง
การลดภาระของตัวเก็บขยะ
- ใช้ตารางเดิมซ้ำแทนการสร้างตารางใหม่
- หลีกเลี่ยงการสร้างคลอเชอร์อายุสั้นจำนวนมากในลูปที่ทำงานบ่อย
- จัดสรรอาร์เรย์ขนาดที่ทราบล่วงหน้าไว้ก่อน
การเก็บสตริงแบบใช้ออบเจ็กต์ร่วม
Lua จัดเก็บสตริงทั้งหมดแบบใช้ออบเจ็กต์ร่วมกัน สตริงที่เหมือนกันจะแชร์ออบเจ็กต์เดียวกัน ซึ่งหมายความว่าการสร้างสตริงใช้เวลา O(n) สำหรับการแฮช แต่การเปรียบเทียบใช้เวลา O(1) สตริงสั้น ๆ จึงมีต้นทุนต่ำมาก
ตัวทำลายขั้นสุดท้าย (__gc)
ตารางสามารถมีเมทาเมธอด __gc ซึ่งตัวเก็บขยะจะเรียกก่อนคืนหน่วยความจำของออบเจ็กต์ เหมาะสำหรับคืนทรัพยากรภายนอก เช่น ตัวจัดการไฟล์หรือตัวชี้ C
คำถามเกี่ยวกับตัวเก็บขยะ
collectgarbage("count") ส่งคืนค่าอะไร
สรุป: พื้นฐานตัวเก็บขยะของ Lua
ตัวเก็บขยะแบบเพิ่มทีละน้อยและทำเครื่องหมายแล้วกวาดของ Lua จะคืนหน่วยความจำที่เข้าถึงไม่ได้โดยอัตโนมัติ ใช้ collectgarbage เพื่อติดตามและควบคุมการเก็บขยะ ลดภาระด้วยการใช้ตารางซ้ำและหลีกเลี่ยงการจัดสรรหน่วยความจำมากเกินไปในเส้นทางการทำงานที่สำคัญ
คำถามที่พบบ่อย
บทเรียน “พื้นฐานตัวเก็บขยะของ Lua” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “พื้นฐานตัวเก็บขยะของ Lua” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “พื้นฐานตัวเก็บขยะของ Lua”
ทำความเข้าใจการทำงานของ GC แบบเพิ่มทีละน้อยใน Lua ได้แก่ การทำเครื่องหมายและกวาดล้าง ค่าขีดจำกัด และ collectgarbage() คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “พื้นฐานตัวเก็บขยะของ Lua” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม
ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐานตัวเก็บขยะของ Lua
- คีย์อ่อนและค่าอ่อน
- ตัวทำลายด้วย __gc
- การหลีกเลี่ยงหน่วยความจำรั่ว