Tôi đã đọc "CLR qua C#" và có vẻ như trong ví dụ này, đối tượng ban đầu được gán cho 'obj' sẽ đủ điều kiện cho Bộ sưu tập rác sau khi thực hiện dòng 1, chứ không phải sau dòng 2.Tuổi thọ của đối tượng trong Java vs .Net
void Foo()
{
Object obj = new Object();
obj = null;
}
Đó là do tuổi thọ biến cục bộ được xác định không theo phạm vi mà nó đã được xác định, nhưng lần cuối bạn đọc nó.
Câu hỏi của tôi là: Java thì sao? Tôi đã viết chương trình này để kiểm tra hành vi như vậy, và có vẻ như đối tượng vẫn còn sống. Tôi không nghĩ rằng nó có thể cho JVM để hạn chế tuổi thọ biến trong khi giải thích bytecode, vì vậy tôi đã cố gắng chạy chương trình với 'java -Xcomp' để buộc biên dịch phương pháp, nhưng 'finalize' không được gọi là anyway. Có vẻ như điều đó không đúng đối với Java, nhưng tôi hy vọng tôi có thể có được câu trả lời chính xác hơn ở đây. Ngoài ra, về máy ảo Dalvik của Android thì sao?
class TestProgram {
public static void main(String[] args) {
TestProgram ref = new TestProgram();
System.gc();
}
@Override
protected void finalize() {
System.out.println("finalized");
}
}
Added: Jeffrey Richter cho ví dụ mã trong "CLR thông qua C#", một cái gì đó như thế này:
public static void Main (string[] args)
{
var timer = new Timer(TimerCallback, null, 0, 1000); // call every second
Console.ReadLine();
}
public static void TimerCallback(Object o)
{
Console.WriteLine("Callback!");
GC.Collect();
}
TimerCallback gọi là một lần duy nhất trên MS Net nếu các dự án mục tiêu là 'phát hành' (timer bị hủy sau cuộc gọi GC.Collect()), và được gọi mỗi giây nếu mục tiêu là 'Debug' (biến tuổi thọ tăng lên vì lập trình viên có thể thử truy cập đối tượng bằng trình gỡ lỗi). Nhưng trên gọi lại Mono được gọi là mỗi giây không có vấn đề làm thế nào bạn biên dịch nó. Có vẻ như các cửa sổ triển khai 'Timer' của Mono tham chiếu đến cá thể ở đâu đó trong nhóm luồng. Triển khai MS không làm điều này.
Tôi đã không tìm thấy điều này trong thông số Java trước đây. Lưu ý rằng .NET có thể thậm chí còn điên hơn bạn có thể mong đợi - có thể cho một cá thể được thu thập * trong khi một phương thức thể hiện đang được thực thi * nếu CLR biết rằng không có biến nào khác được gọi. –