Vì http là không trạng thái, mọi yêu cầu đối với ứng dụng sẽ tạo đối tượng mới. Làm thế nào để Rails làm sạch các đối tượng không sử dụng/thường xuyên như thế nào?Bộ sưu tập rác Ruby/Rails
Trả lời
câu trả lời đơn giản: thời gian chạy Ruby có một bộ thu rác. Tùy thuộc vào thời gian chạy (JRuby/JVM thế hệ GC, IronRuby/CLR thế hệ GC, cổ điển Ruby/mark-sweep GC) thuật toán khác nhau được sử dụng. Nhưng những điều cơ bản là khá đơn giản:
- Khi một yêu cầu phân bổ nếu có "không đủ bộ nhớ miễn phí" có sẵn - bao nhiêu là đủ là một trong những thành phần của thuật toán GC - sau đó một GC sẽ bắt
- Các GC bắt đầu bằng cách quét rễ, là các biến toàn cầu và vị trí ngăn xếp (tham số và biến cục bộ), để khám phá các đối tượng nào vẫn còn sống; nó đánh dấu từng đối tượng mà nó tìm thấy
- Sau đó, quy trình GC xem xét các liên kết (tham chiếu) bên trong các đối tượng này và đệ quy lại các đối tượng chưa được đánh dấu
- GC sau đó có thể bắt đầu di chuyển/sao chép tất cả các đối tượng được đánh dấu để chúng được nén gọn trong bộ nhớ
- "Con trỏ tự do", từ khi xuất hiện phân bổ mới, được đặt lại ở cuối đoạn mã được nén gọn này
- Nếu vẫn còn "bộ nhớ trống", thì phân bổ nhiều hơn từ hệ điều hành
- Tất cả các đối tượng cũ không được đánh dấu trong quá trình quét đều là rác và được loại bỏ hoàn toàn e sao chép quá trình và đặt lại của con trỏ miễn phí.
Tần suất bộ sưu tập phụ thuộc vào điều chỉnh GC, có thể bị ảnh hưởng bởi hệ điều hành, số lượng bộ nhớ vật lý, bộ nhớ hệ điều hành, điều chỉnh người dùng, phiên bản nền tảng cơ bản. các thông số, vv Phần lớn nó đi xuống để quyết định nơi mà thanh nằm trong đó "không đủ bộ nhớ miễn phí" thử nghiệm, mặc dù mọi thứ trở nên phức tạp hơn với các nhà sưu tập thế hệ.
Nếu bạn quan tâm đến điều này, bạn nên xem loạt blog về bộ sưu tập rác sao chép trên ghi chép của nhóm Phusion và những nỗ lực của họ để cải tiến chương trình ruby gc mặc định trong Ruby Enterprise Edition.
http://izumi.plan99.net/blog/index.php/2007/04/05/saving-memory-in-ruby-on-rails/
liên kết khác trong loạt ở đây:
- 1. Bộ sưu tập rác
- 2. Bộ sưu tập rác java
- 3. Bộ sưu tập rác trong dalvik vm
- 4. Bộ sưu tập rác và cgo
- 5. Bộ sưu tập rác trong bash
- 6. Bộ sưu tập Rác Javascript tạm dừng
- 7. Thu hồi bộ sưu tập rác PHP
- 8. Bộ sưu tập rác trong .Net 4.0
- 9. Bộ sưu tập và chủ đề rác
- 10. Bộ sưu tập rác mỗi 100 giây
- 11. Bộ sưu tập rác tại Delphi
- 12. WinRT có bộ sưu tập rác không?
- 13. C# Bộ sưu tập rác Bộ rễ hoạt động
- 14. Bộ sưu tập Bộ lọc Thư rác Công khai
- 15. Bộ sưu tập rác với Ruby C Extension
- 16. Phát triển trò chơi Android và Bộ sưu tập rác
- 17. Kích hoạt bộ sưu tập rác .NET bên ngoài
- 18. Bộ sưu tập rác trong android (Thực hiện thủ công)
- 19. Cách cấu hình bộ sưu tập rác trong Ruby
- 20. Cách sử dụng bộ sưu tập rác để xóa tệp?
- 21. Thế hệ trong Bộ sưu tập rác là gì?
- 22. Bộ sưu tập rác đối tượng Ruby Class
- 23. Bộ sưu tập rác dalvik Android có thể bị lỗi?
- 24. Bộ sưu tập và chuỗi thu gom rác
- 25. NewLISP có sử dụng bộ sưu tập rác không?
- 26. Unity3D: tối ưu hóa bộ sưu tập rác
- 27. làm mới trình duyệt không làm bộ sưu tập rác
- 28. C bộ sưu tập # rác với đối tượng tham chiếu
- 29. Các mẫu sưu tập rác bất thường
- 30. Con trỏ đảo ngược trong bộ sưu tập rác và quét rác là gì?