Tôi nghi ngờ rằng việc xây dựng một thể hiện của một Chủ đề hoặc một lớp con sẽ làm rò rỉ bộ nhớ. Thứ nhất, không có gì trong các loại được đề cập trong Javadocs hoặc Đặc tả Ngôn ngữ Java. Thứ hai, tôi chạy một thử nghiệm đơn giản và nó cũng cho thấy rằng không có ký ức đang bị rò rỉ (ít nhất là không phải trên của Sun JDK 1.5.0_05 trên 32-bit x86 Linux 2.6):
public final class Test {
public static final void main(String[] params) throws Exception {
final Runtime rt = Runtime.getRuntime();
long i = 0;
while(true) {
new MyThread().run();
i++;
if ((i % 100) == 0) {
System.out.println((i/100) + ": " + (rt.freeMemory()/1024/1024) + " " + (rt.totalMemory()/1024/1024));
}
}
}
static class MyThread extends Thread {
private final byte[] tmp = new byte[10 * 1024 * 1024];
public void run() {
System.out.print(".");
}
}
}
EDIT: Chỉ cần tóm tắt ý tưởng thử nghiệm ở trên. Mỗi cá thể của lớp con MyThread của một Thread tham chiếu mảng 10 MB của riêng nó. Nếu các phiên bản MyThread không được thu thập rác, JVM sẽ hết bộ nhớ khá nhanh. Tuy nhiên, việc chạy mã thử nghiệm cho thấy JVM đang sử dụng một lượng bộ nhớ không đổi nhỏ bất chấp số lượng MyThread được xây dựng cho đến nay. Tôi tuyên bố điều này là bởi vì các trường hợp của MyThread được thu gom rác.
Đây có phải là sự cố phụ thuộc vào triển khai thực hiện (ví dụ JVM của Sun) hay được nêu ở đâu đó trong Đặc tả Ngôn ngữ Java không? – Alexander
Đã chỉnh sửa - Tôi đã thực hiện một số điều tra khác và đó là lỗi JVM – slim