【转】线程问题引起的内存泄露
2013-03-22 14:22
357 查看
转自:http://liubin.nanshapo.com/2010/12/28/memory-leak-for-the-thread/
最近解决的一个内存泄露,竟然是由于线程问题引起的
看看下面代码,如何?
有什么问题吗?
对,这段代码生成了一个thread的对象,竟然调用了run方法,这引起了内存泄露。
必须改为start才行。
而run方法,只是调用了Runnable的run方法而已:
// Thread.class
而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()
最近解决的一个内存泄露,竟然是由于线程问题引起的
看看下面代码,如何?
new Thread(new Runnable() { public void run() { MessagingNotification.updateSendFailedNotificationForThread(ComposeMessageActivity.this, threadId); } }).run();
有什么问题吗?
对,这段代码生成了一个thread的对象,竟然调用了run方法,这引起了内存泄露。
必须改为start才行。
而run方法,只是调用了Runnable的run方法而已:
// Thread.class
public void run() { if (target != null) { target.run(); } }
而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()
相关文章推荐
- Java线程引起的内存泄露问题浅析
- 使用AndroidStudio分析和解决ImageLoader引起内存泄露问题
- Handler引起的内存泄露问题
- Linux 程序设计中由线程使用不当引起的内存泄露
- 使用AndroidStudio分析和解决ImageLoader引起内存泄露问题
- mongodb引起内存泄露问题
- Handler引起的内存泄露问题
- 找出并解决 JavaScript 和 Dojo 引起的浏览器内存泄露问题
- android开发避免Context引起的内存泄露问题
- 线程内存泄露问题
- deepcopy引起的LUA内存泄露的问题
- 线程没有正常结束产生的内存泄露问题的解决
- Activity的四大启动方式&&启动Activity引起的内存泄露问题
- 浅谈js 闭包引起的内存泄露问题
- 内存不稳定引起的自动爆机问题
- uWSGI定时器导致web.py的内存泄露问题
- cvLoadImage,cvCloneImage的内存泄露问题
- memset函数导致内存泄露的问题
- 分析内存泄露问题