当我在Thread对象上调用run()时,为什么我的Java程序会泄漏内存?

sli*_*lim 28 java multithreading memory-leaks

(危险的问题,我希望当我遇到这个问题时答案已经在线)

使用Java 1.4,我有一个方法,我想在某些时候作为一个线程运行,但不是在其他人.所以我将它声明为Thread的子类,然后根据我的需要调用start()或run().

但我发现我的程序会随着时间的推移泄漏内存.我究竟做错了什么?

sli*_*lim 47

这是Java 1.4中的一个已知错误:http://bugs.sun.com/bugdatabase/view_bug.do; jsessionid = 5886e03fee226ffffffffc40d4fa881a86e3: WuuT?bug_id = 4533087

它已在Java 1.5中修复,但Sun并不打算在1.4中修复它.

问题是,在构造时,a Thread被添加到内部线程表中的引用列表中.在start()方法完成之前,它不会从该列表中删除.只要该引用存在,就不会收集垃圾.

所以,永远不要创建一个线程,除非你肯定会调用它的start()方法.一个Thread对象的run()方法,不应该被直接调用.

编写代码的更好方法是实现Runnable接口而不是子类Thread.当您不需要线程时,请致电

myRunnable.run();
Run Code Online (Sandbox Code Playgroud)

当你需要一个线程时:

Thread myThread = new Thread(myRunnable);
myThread.start();
Run Code Online (Sandbox Code Playgroud)