Lua - Thu gom rác
Lua sử dụng tính năng quản lý bộ nhớ tự động sử dụng tính năng thu gom rác dựa trên một số thuật toán nhất định được tích hợp sẵn trong Lua. Là kết quả của quản lý bộ nhớ tự động, với tư cách là nhà phát triển -
- Không cần phải lo lắng về việc cấp phát bộ nhớ cho các đối tượng.
- Không cần giải phóng chúng khi không còn cần thiết ngoại trừ việc đặt nó thành nil.
Lua sử dụng một bộ thu gom rác chạy theo thời gian để thu thập các đối tượng đã chết khi chúng không thể truy cập được nữa từ chương trình Lua.
Tất cả các đối tượng bao gồm bảng, dữ liệu người dùng, chức năng, luồng, chuỗi, v.v. phải chịu sự quản lý bộ nhớ tự động. Lua sử dụng bộ thu gom đánh dấu và quét tăng dần sử dụng hai số để kiểm soát các chu kỳ thu gom rác của nó, cụ thể làgarbage collector pause và garbage collector step multiplier. Các giá trị này tính theo phần trăm và giá trị 100 thường bằng 1 trong nội bộ.
Công cụ thu gom rác tạm dừng
Tính năng tạm dừng của người thu gom rác được sử dụng để kiểm soát thời gian người thu gom rác cần chờ trước đó; nó được gọi lại bằng quản lý bộ nhớ tự động của Lua. Giá trị nhỏ hơn 100 có nghĩa là Lua sẽ không đợi chu kỳ tiếp theo. Tương tự, các giá trị cao hơn của giá trị này sẽ dẫn đến việc bộ thu gom rác hoạt động chậm và kém tích cực hơn trong tự nhiên. Giá trị 200, có nghĩa là bộ sưu tập đợi tổng bộ nhớ được sử dụng tăng gấp đôi trước khi bắt đầu một chu kỳ mới. Do đó, tùy thuộc vào bản chất và tốc độ của ứng dụng, có thể có yêu cầu thay đổi giá trị này để có được hiệu suất tốt nhất trong các ứng dụng Lua.
Hệ số nhân bước của bộ thu gom rác
Hệ số nhân bước này kiểm soát tốc độ tương đối của bộ thu gom rác với tốc độ phân bổ bộ nhớ trong chương trình Lua. Giá trị bước lớn hơn sẽ dẫn đến việc thu gom rác hoạt động mạnh hơn và nó cũng làm tăng kích thước bước của mỗi bước thu gom rác gia tăng. Các giá trị nhỏ hơn 100 thường có thể dẫn đến việc tránh bộ thu gom rác không hoàn thành chu trình của nó và thường không được ưa thích. Giá trị mặc định là 200, có nghĩa là bộ thu gom rác chạy gấp đôi tốc độ cấp phát bộ nhớ.
Chức năng của bộ thu gom rác
Là nhà phát triển, chúng tôi có một số quyền kiểm soát việc quản lý bộ nhớ tự động trong Lua. Đối với điều này, chúng tôi có các phương pháp sau.
collectgarbage("collect") - Chạy một chu kỳ thu gom rác hoàn chỉnh.
collectgarbage("count") - Trả về dung lượng bộ nhớ hiện đang được chương trình sử dụng tính bằng Kilobyte.
collectgarbage("restart") - Nếu bộ thu gom rác đã bị dừng, nó sẽ khởi động lại.
collectgarbage("setpause")- Đặt giá trị đã cho dưới dạng tham số thứ hai chia cho 100 cho biến tạm dừng của bộ thu gom rác. Công dụng của nó như đã thảo luận ở trên.
collectgarbage("setstepmul")- Đặt giá trị đã cho dưới dạng tham số thứ hai chia cho 100 cho biến số nhân bước rác. Công dụng của nó như đã thảo luận ở trên.
collectgarbage("step")- Chạy một bước thu gom rác. Đối số thứ hai càng lớn thì bước này sẽ càng lớn. Thu gom rác sẽ trả về true nếu bước được kích hoạt là bước cuối cùng của chu trình thu gom rác.
collectgarbage("stop") - Dừng bộ thu gom rác nếu nó đang chạy.
Dưới đây là một ví dụ đơn giản sử dụng bộ thu gom rác.
mytable = {"apple", "orange", "banana"}
print(collectgarbage("count"))
mytable = nil
print(collectgarbage("count"))
print(collectgarbage("collect"))
print(collectgarbage("count"))
Khi chúng ta chạy chương trình trên, chúng ta sẽ nhận được kết quả sau. Xin lưu ý rằng kết quả này sẽ thay đổi do sự khác biệt về loại hệ điều hành và tính năng quản lý bộ nhớ tự động của Lua.
23.1455078125 149
23.2880859375 295
0
22.37109375 380
Bạn có thể thấy trong chương trình trên, một khi thu dọn rác được thực hiện, nó sẽ giảm bộ nhớ được sử dụng. Nhưng, nó không bắt buộc phải gọi này. Ngay cả khi chúng tôi không gọi chúng, nó sẽ được trình thông dịch Lua thực thi tự động ở giai đoạn sau sau khoảng thời gian được xác định trước.
Rõ ràng, chúng ta có thể thay đổi hành vi của bộ thu gom rác bằng các chức năng này nếu được yêu cầu. Các chức năng này cung cấp một chút khả năng bổ sung cho nhà phát triển để xử lý các tình huống phức tạp. Tùy thuộc vào loại bộ nhớ cần cho chương trình, bạn có thể sử dụng hoặc không sử dụng tính năng này. Nhưng sẽ rất hữu ích khi biết mức sử dụng bộ nhớ trong các ứng dụng và kiểm tra nó trong quá trình lập trình để tránh kết quả không mong muốn sau khi triển khai.