【转】线程问题引起的内存泄露
转自:http://liubin.nanshapo.com/2010/12/28/memory-leak-for-the-thread/
最近解决的一个内存泄露,竟然是由于线程问题引起的
看看下面代码,如何?
1 new Thread(new Runnable() { 2 public void run() { 3 MessagingNotification.updateSendFailedNotificationForThread(ComposeMessageActivity.this, threadId); 4 } 5 }).run();
有什么问题吗?
对,这段代码生成了一个thread的对象,竟然调用了run方法,这引起了内存泄露。
必须改为start才行。
而run方法,只是调用了Runnable的run方法而已:
// Thread.class
1 public void run() { 2 if (target != null) { 3 target.run(); 4 } 5 }
而start方法则不同
低版本的java有这个问题,不知道为什么Android2.2还有这个问题:
http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=5869e03fee226ffffffffc40d4fa881a86e3:WuuT?bug_id=4533087
按上面说法,生产一个Thread对象,会在构造器调用init方法,这个方法会把线程加入到一个group里,而从group里删除实在exit方法里做的,如果只调用run,这个exit方法则不会被调用。
结论就是如果用Thread,尽量都用start()
myThread = new Thread(myRunnable);
myThread.start();
如果是Runnable,可以用run
myRunnable.run()
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· 程序员常用高效实用工具推荐,办公效率提升利器!
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 【译】WinForms:分析一下(我用 Visual Basic 写的)