Latest web development tutorials

เก็บขยะหลัว

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

Luaกำลังทำงานเก็บขยะที่จะเก็บรวบรวมวัตถุตายทั้งหมด(นั่นคือวัตถุที่ไม่สามารถเข้าถึงได้ใน Lua) เพื่อดำเนินการจัดการหน่วยความจำอัตโนมัติ Lua จะใช้ในหน่วยความจำทั้งหมดเช่น: สตริงตารางข้อมูลของผู้ใช้ฟังก์ชั่น, กระทู้, โครงสร้างภายในและอื่น ๆ อาจมีการจัดการโดยอัตโนมัติ

Lua ใช้เครื่องหมายที่เพิ่มขึ้น - สแกนเก็บ โดยจะใช้ตัวเลขสองตัวในการควบคุมรอบการเก็บขยะ: ขยะเก็บอัตราการจัดเก็บขยะและการขยายก้าวสม่ำเสมอ ตัวเลขทั้งสองใช้อัตราร้อยละของหน่วย (ตัวอย่างเช่น: ค่าของ 100 ในการแสดงภายใน 1)

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

กำลังขยายการเก็บขยะ stepper ควบคุมความเร็วในการทำงานของสะสมเทียบกับหน่วยความจำความเร็วอัตราส่วนการจัดสรร นี้จะไม่เพียงเพิ่มมูลค่าของสะสมเชิงรุกมากขึ้น แต่ยังเพิ่มความยาวของขั้นตอนที่เพิ่มขึ้นในแต่ละ ไม่ได้ตั้งค่านี้จะน้อยกว่า 100 ดังนั้นหากสะสมในการทำงานช้าดังนั้นเสมอมากที่ต้องทำห่วง ค่าเริ่มต้นคือ 200 ซึ่งหมายความว่าการจัดสรรหน่วยความจำที่เก็บของ "คู่" การทำงานความเร็ว

หากคุณขั้นตอนการขยายไปยังหมายเลขที่มีขนาดใหญ่มาก (จำนวนไบต์กว่าที่คุณอาจจะใช้ในโปรแกรมยังอยู่ที่ 10% มีขนาดใหญ่) สะสมทำหน้าที่เหมือนเป็นนักสะสมหยุดโลก แล้วถ้าคุณใส่อัตราเนื่องตั้ง 200 พฤติกรรมของสะสมและรุ่นที่ผ่านมาของ Lua เดียวกัน: แต่ละหน่วยความจำที่ใช้โดย Lua สองเท่าที่จะทำคอลเลกชันที่สมบูรณ์


ฟังก์ชั่นการเก็บขยะ

Lua ให้ฟังก์ชั่นcollectgarbage ดังต่อไปนี้ ([Opt [ARG]]) ถูกนำมาใช้ในการควบคุมการจัดการหน่วยความจำอัตโนมัติ:

  • collectgarbage ( "เก็บ"): ทำรอบการเก็บขยะเต็มเลือกพารามิเตอร์ซึ่งมีชุดที่แตกต่างกันของการทำงาน:

  • collectgarbage ( "นับ"): K เพื่อกลับจำนวนไบต์จำนวนของหน่วยความจำที่ใช้โดย Luaค่านี้จะมีส่วนที่เป็นเศษส่วนเราต้องคูณ 1024 คุณจะได้รับจำนวนที่แน่นอนของไบต์ใช้โดย Lua (ยกเว้นกรณีที่การใช้จ่ายเกิน)

  • collectgarbage ( "รีสตาร์ท"): เริ่มเก็บขยะจะทำงานโดยอัตโนมัติ

  • collectgarbage ( "setpause"): ชุดตัวเก็บรวบรวมหาเรื่องอัตราเนื่อง (ดูนิกาย; 2.5)กลับไปที่ค่าก่อนหน้านี้ของอัตราเนื่อง

  • collectgarbage ( "setstepmul"): แสดงค่าก่อนหน้าของการขยายขั้นตอน

  • collectgarbage ( "ขั้นตอน"): ขั้นตอนหนึ่งเรียกเก็บขยะขั้นตอนที่ "ขนาด" โดยการควบคุมหาเรื่อง 0 ที่เข้ามาเก็บ stepper (แบ่งแยก) ขั้นตอน ที่เข้ามาไม่ใช่ศูนย์ที่มีมูลค่าสะสมในการเก็บรวบรวมการจัดสรร Lua เทียบเท่าหลายเหล่านี้ (K bytes) ของการทำงานของหน่วยความจำ ถ้าปลายสะสมของวงจรจะกลับจริง

  • collectgarbage ( "หยุด"): หยุดวิ่งเก็บขยะก่อนที่จะเรียกการรีสตาร์ทเก็บเพียงเพราะการโทรอย่างชัดเจนในการทำงาน

ต่อไปนี้จะแสดงให้เห็นถึงตัวอย่างการเก็บขยะง่าย:

mytable = {"apple", "orange", "banana"}

print(collectgarbage("count"))

mytable = nil

print(collectgarbage("count"))

print(collectgarbage("collect"))

print(collectgarbage("count"))

โปรแกรมข้างต้นออกผลมีดังนี้ (หมายเหตุ: ในการเปลี่ยนแปลงการใช้งานหน่วยความจำ):

20.9560546875
20.9853515625
0
19.4111328125