0Pricing
Lua Academy · บทเรียน

พื้นฐานตัวเก็บขยะของ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐานตัวเก็บขยะของ Lua
  2. คีย์อ่อนและค่าอ่อน
  3. ตัวทำลายด้วย __gc
  4. การหลีกเลี่ยงหน่วยความจำรั่ว
← กลับไปที่ Lua Academy