Giả sử chúng ta có một chương trình như thế này:Java có thể thu thập các biến trước khi kết thúc phạm vi không?
void main() {
// Point 0
BigThing bt = new BigThing();
// Point 1
WeakReference<BigThing> weak = new WeakReference<>(bt);
// Point 2
doSomething(weak);
// Point 3
}
void doSomething(...) { ... }
Chúng ta biết rằng các tài liệu tham khảo yếu đến đối tượng BigThing
không thể ngăn chặn các đối tượng bị thu rác khi nó trở nên không còn mạnh mẽ thể truy cập.
Câu hỏi của tôi là về biến cục bộ bt
là tham chiếu mạnh mẽ đối tượng BigThing
. Đối tượng có trở nên không thể tiếp cận mạnh tại điểm 2 (ngay trước khi gọi doSomething()
) hoặc tại điểm 3 (kết thúc phạm vi khối) không?
Câu trả lời cho câu hỏi này sẽ ảnh hưởng đến việc cuộc gọi đến doSomething()
được đảm bảo có thể truy cập đối tượng trực tiếp BigThing
hay không.
Tôi không chắc chắn vì bạn có thể tranh luận rằng sau điểm 2, biến cục bộ bt
không bao giờ được đọc hoặc viết nữa, do đó biến bị chết hiệu quả và giá trị con trỏ có thể bị loại bỏ. "Tối ưu hóa" này sẽ hợp lệ nếu tất cả các tham chiếu đều mạnh mẽ, nhưng lý do bị tách rời khi các khái niệm về các tham chiếu mềm, yếu, và ma được giới thiệu và các trình kết thúc. Cũng giống như một sự tương tự, bởi vì C++ có các hàm hủy, một giá trị phải được hủy ở cuối phạm vi và không thể được di chuyển về phía trước đến thời điểm sử dụng cuối cùng.
Trong Java, “phạm vi” là một tạo phẩm thời gian biên dịch và không ảnh hưởng đến bộ thu gom rác tại thời gian chạy theo bất kỳ cách nào. – Holger