2009-07-13 37 views
7

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

12

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ệ.