2010-04-15 34 views
6

Tôi đã tự hỏi nếu có một phương thức .finalize() tương tự cho các đối tượng Ruby, đánh dấu chúng sẵn sàng cho việc thu gom rác. Nếu tôi sẽ tạo 20.000 đối tượng và mỗi cá thể có một bộ đếm, tôi muốn đối tượng được đánh dấu để thu thập rác khi đạt đến 0. Tôi biết đây là một cách tiếp cận Java khá nhiều, nhưng tôi không có đủ kinh nghiệm với Ruby để hiểu cách thực hiện điều này tốt hơn.Ruby: Đánh dấu một đối tượng để thu gom rác

Cảm ơn câu trả lời, nhận xét và phản hồi của bạn!

+2

hoàn thành không đánh dấu các đối tượng để thu thập rác, đó là phương pháp chạy (mặc dù không có bảo đảm) ngay trước khi GC xóa đối tượng – pablochan

+0

Thats tốt để biết, cảm ơn bạn đã chỉ ra điều đó. Có một phương pháp cụ thể mà phá hủy một cách rõ ràng đối tượng hoặc ít nhất là đặt điều này tại chuyển động? Tôi thích phép thuật, nhưng tôi cũng thích hiểu các thủ thuật được phơi bày. – Shyam

+1

Bạn chỉ cần xóa tất cả các tham chiếu đến đối tượng e. g. nếu bạn có một tham chiếu x bạn chỉ cần đặt nó là null hoặc bạn có một biến cục bộ thet được ra khỏi phạm vi. Nếu không có tham chiếu một đối tượng nó có sẵn cho GC. – pablochan

Trả lời

7

Theo như tôi biết, bạn không thể đánh dấu một đối tượng sẵn sàng cho GC nhưng bạn có thể buộc GC bất cứ lúc nào:

GC.start 

Nếu mặt hàng có thể được giải phóng, nó sẽ được giải phóng.

+5

Không còn đúng kể từ khi MRI 1.9.3 giới thiệu lướt quét GC – glebm

+1

Phần này vẫn còn đúng mặc dù: "bạn không thể đánh dấu một đối tượng đã sẵn sàng cho GC". Ruby sử dụng cách tiếp cận ngược lại - các đối tượng có thể đạt được được đánh dấu là "không xóa". Mọi thứ khác được giải phóng sau khi giai đoạn đánh dấu hoàn thành. Điều này đã không thay đổi, nó chỉ không xảy ra ngay lập tức khi bạn gọi 'GC.start' –

Các vấn đề liên quan