2010-09-27 21 views

Trả lời

9

Đối tượng sẽ không được thu thập cho đến khi nó không thể truy cập được nữa.

Theo số JavaDoc, hoàn thành() sẽ không được gọi lại.

3

Vâng, đây là lý do tại sao bạn không sử dụng finalizers (Vâng, một trong nhiều lý do).

Có một bộ sưu tập tham chiếu được thực hiện để thực hiện công cụ này. Tôi sẽ xem xét nó và đăng nó ở đây trong một giây, nhưng tôi nghĩ đó là PhantomReference.

Yep, PhantomReference:

đối tượng tham khảo Phantom, được enqueued sau khi các nhà sưu tập xác định rằng referents của họ bằng cách khác có thể được khai hoang. Các tham chiếu Phantom thường được sử dụng để lên lịch cho các hành động dọn dẹp trước khi xử lý một cách linh hoạt hơn khả năng với cơ chế hoàn thiện Java.

+0

Không, đó là lý do tại sao không viết một người cuối cùng bị phá vỡ (nếu không có đủ lý do khác). –

7

Nếu bạn đọc kỹ mô tả API, bạn sẽ thấy rằng trình hoàn thiện có thể làm cho đối tượng có thể truy cập lại. Đối tượng sẽ không bị hủy cho đến khi không thể truy cập được (một lần nữa), nhưng finalize() sẽ không được gọi nhiều lần.

+0

Trên thực tế, finalizer * không * làm cho đối tượng có thể truy cập mạnh mẽ thông qua tham chiếu bắt nguồn giữa thời gian đối tượng được tìm thấy là không thể truy cập được và thời gian finalizer của nó được chạy. Nếu trong thời gian đó đối tượng được tìm thấy không thể truy cập trở thành tham chiếu duy nhất còn tồn tại đối với một đối tượng khác, đối tượng kia sẽ không thể thu thập được cho đến khi finalizer được chạy hoặc tham chiếu đó không hợp lệ qua một số phương tiện khác. – supercat

10

Sau đó, về cơ bản, đối tượng không thu thập rác. Điều này được gọi là phục sinh đối tượng. Thực hiện tìm kiếm cho cụm từ đó và bạn sẽ nhận được một loạt các bài viết thú vị. Như Jim đã đề cập, một điểm quan trọng là trình hoàn thành sẽ chỉ được chạy một lần.

3

Nó thực sự thực hiện một đường chuyền khác để kiểm tra và đảm bảo không có thêm tham chiếu đến đối tượng. Vì nó sẽ thất bại trong bài kiểm tra trên lần thứ hai, bạn sẽ không giải phóng bộ nhớ cho đối tượng.

Bởi vì hoàn thành chỉ được gọi là một lần duy nhất cho bất kỳ đối tượng nhất định, thời gian tiếp theo thông qua khi nó không có tài liệu tham khảo, nó sẽ chỉ giải phóng bộ nhớ mà không gọi finalize. Một số thông tin tốt here về quyết toán.

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