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