gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:14:26 28 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

所以,除非你确定要调用它的 start() 方法,否则永远不要创建线程。不应直接调用 Thread 对象的 run() 方法。

更好的编码方式是实现Runnable接口(interface)而不是子类Thread。当你不需要线程时,调用

myRunnable.run();

当你确实需要线程时:

Thread myThread = new Thread(myRunnable);
myThread.start();

关于java - 当我在 Thread 对象上调用 run() 时,为什么我的 Java 程序会泄漏内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/107823/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com