ลัวะ - เก็บขยะ

Lua ใช้การจัดการหน่วยความจำอัตโนมัติที่ใช้การรวบรวมขยะตามอัลกอริทึมบางอย่างที่สร้างขึ้นใน Lua อันเป็นผลมาจากการจัดการหน่วยความจำอัตโนมัติในฐานะผู้พัฒนา -

  • ไม่ต้องกังวลเรื่องการจัดสรรหน่วยความจำสำหรับวัตถุ
  • ไม่จำเป็นต้องปลดปล่อยเมื่อไม่จำเป็นอีกต่อไปยกเว้นการตั้งค่าเป็นศูนย์

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

ออบเจ็กต์ทั้งหมดรวมถึงตารางข้อมูลผู้ใช้ฟังก์ชันเธรดสตริงและอื่น ๆ อยู่ภายใต้การจัดการหน่วยความจำอัตโนมัติ Lua ใช้เครื่องหมายที่เพิ่มขึ้นและตัวเก็บกวาดที่ใช้ตัวเลขสองตัวเพื่อควบคุมรอบการรวบรวมขยะคือgarbage collector pause และ garbage collector step multiplier. ค่าเหล่านี้เป็นเปอร์เซ็นต์และค่า 100 มักจะเท่ากับ 1 ภายใน

ตัวเก็บขยะหยุดชั่วคราว

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

ตัวคูณขั้นตอนการเก็บขยะ

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

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

ในฐานะนักพัฒนาเราสามารถควบคุมการจัดการหน่วยความจำอัตโนมัติใน Lua ได้ สำหรับสิ่งนี้เรามีวิธีการดังต่อไปนี้

  • collectgarbage("collect") - เรียกใช้การรวบรวมขยะครบหนึ่งรอบ

  • collectgarbage("count") - ส่งคืนจำนวนหน่วยความจำที่โปรแกรมใช้ในปัจจุบันเป็นกิโลไบต์

  • collectgarbage("restart") - หากเครื่องเก็บขยะหยุดทำงานเครื่องจะเริ่มการทำงานใหม่

  • collectgarbage("setpause")- ตั้งค่าที่กำหนดให้เป็นพารามิเตอร์ที่สองหารด้วย 100 ให้กับตัวแปรหยุดชั่วคราวของตัวรวบรวมขยะ การใช้งานมีดังที่กล่าวไว้ข้างต้นเล็กน้อย

  • collectgarbage("setstepmul")- ตั้งค่าที่กำหนดให้เป็นพารามิเตอร์ที่สองหารด้วย 100 ให้กับตัวแปรตัวคูณขั้นขยะ การใช้งานมีดังที่กล่าวไว้ข้างต้นเล็กน้อย

  • collectgarbage("step")- เรียกใช้ขั้นตอนเดียวของการรวบรวมขยะ ยิ่งอาร์กิวเมนต์ที่สองมีขนาดใหญ่เท่าไหร่ขั้นตอนนี้ก็จะยิ่งใหญ่ขึ้นเท่านั้น การรวบรวมขยะจะคืนค่าเป็นจริงหากขั้นตอนที่ทริกเกอร์เป็นขั้นตอนสุดท้ายของวงจรการรวบรวมขยะ

  • collectgarbage("stop") - หยุดเครื่องเก็บขยะหากทำงานอยู่

ตัวอย่างง่ายๆโดยใช้ตัวอย่างตัวเก็บขยะแสดงไว้ด้านล่าง

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

print(collectgarbage("count"))

mytable = nil

print(collectgarbage("count"))

print(collectgarbage("collect"))

print(collectgarbage("count"))

เมื่อเรารันโปรแกรมข้างต้นเราจะได้ผลลัพธ์ดังต่อไปนี้ โปรดทราบว่าผลลัพธ์นี้จะแตกต่างกันไปเนื่องจากความแตกต่างในประเภทของระบบปฏิบัติการและคุณสมบัติการจัดการหน่วยความจำอัตโนมัติของ Lua

23.1455078125   149
23.2880859375   295
0
22.37109375     380

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

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