非静态内部类可能导致的内存泄漏及其优化

package cc.cc;

import android.os.Bundle;
import android.app.Activity;

/**
 * Demo描述:
 * 非静态内部类可能导致的内存泄露及其优化
 *
 * 在MainActivity中定义了两个内部类InnerClassTest和ThreadSubClass.
 * 在这里需要注意一个问题:
 * 内部类持有外部类的引用!!!!
 * 或者说内部类对外部类持有隐式的引用!!!!
 *
 * 假如我们在内部类中做耗时的操作或者说有个while(true)死循环,即内部类的对象一直存在;
 * 那么当这个MainActivity应该被回收时(比如屏幕的旋转)GC发现它还被其内部类的对象引用
 * 所以就不会将其回收.假如该Activity中含有大量的资源(比如图片)那么就很容易发生OOM.
 *
 * 优化方式:
 * 使用静态的内部类,这样的内部类就不会持有外部类的隐式引用;也就不会影响到GC对于外部类的回收
 *
 *
 * 参考资料:
 * 1 http://blog.csdn.net/guolin_blog/article/details/42238633
 * 2 http://blog.csdn.net/tu_bingbing/article/details/10395129
 * 3 http://blog.csdn.net/zhangjg_blog/article/details/20000769
 * 4 http://blog.csdn.net/zhongwcool/article/details/22886067
 * 5 http://foolog.net/wap/index-wap2.php?p=2550
 * 6 http://blog.csdn.net/theone10211024/article/details/45645309
 * 7 http://blog.csdn.net/tu_bingbing/article/details/10350533
 * 8 http://www.eoeandroid.com/thread-571279-1-1.html
 * 9 http://2dxgujun.com/post/2014/09/11/Handler-Leaks-Solution.html
 *   Thank you very much
 *
 */
public class MainActivity extends Activity {
    private BetterThread mBetterThread;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	}

	private void init(){
		mBetterThread=new BetterThread();
		mBetterThread.start();
	}

	//定义一个内部类
	private class InnerClassTest {

		private InnerClassTest() {

		}

		private void methodA() {
			//Activity activity=MainActivity.this;
		}

		private void methodB() {

		}

	}

	//定义一个内部类
	private class ThreadSubClass extends Thread{
		@Override
		public void run() {
			super.run();
			//Activity activity=MainActivity.this;
		}

	}

	//优化后的方式
	private static class BetterThread extends Thread {
		private boolean isRunning = true;
		@Override
		public void run() {
			super.run();
			while(isRunning){
				//doing something
			}
		}

		public void stopThread(){
			isRunning=false;
		}
	}

	//停止线程
	@Override
	protected void onDestroy() {
		mBetterThread.stopThread();
		super.onDestroy();
	}

}

时间: 2024-10-05 17:10:49

非静态内部类可能导致的内存泄漏及其优化的相关文章

Handler可能导致的内存泄漏及其优化

package cc.cc; import java.lang.ref.WeakReference; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; /** * Demo描述: * Handler可能导致的内存泄露及其优化 * * 1 关于常见的Handler的用法但是可能导致内存泄露 * 请参考方法initHandler()

static关键字所导致的内存泄漏问题

大家都知道内存泄漏和内存溢出是不一样的,内存泄漏所导致的越来越多的内存得不到回收的失手,最终就有可能导致内存溢出,下面说一下使用staitc属性所导致的内存泄漏的问题. 在dalvik虚拟机中,static变量所指向的内存引用,如果不把它设置为null,GC是永远不会回收这个对象的,所以就有了以下情况: [java] view plain copy public class SecondActivity extends Activity{ private Handler mHandler = n

View的post方法导致的内存泄漏分析

简述: 写这篇文章的缘由是最近项目中查内存泄漏时,发现最终原因是由于异步线程调用View的的post方法导致的. 为何我会使用异步线程调用View的post方法,是因为项目中需要用到很多复杂的自定义布局,需要提前解析进入内存,防止在主线程解析导致卡顿,具体的实现方法是在Application启动的时候,使用异步线程解析这些布局,等需要使用的时候直接从内存中拿来用. 造成内存泄漏的原因,需要先分析View的post方法执行流程,也就是文章前半部分的内容 文章内容: View#post方法作用以及实

使用HandyJSON导致的内存泄漏问题相关解决方法

在移动开发中,与服务器打交道是不可避免的,从服务器拿到的接口数据最终都会被我们解析成模型,现在比较常见的数据传输格式是json格式,对json格式的解析可以使用原生的解析方式,也可以使用第三方的,我们的项目中使用的是阿里开源的一个swift编写的解析框架--HandyJSON. 在使用过程中,使用instruments的Leak Checks工具对内存泄漏进行检测时发现了这个框架导致了不少的内存泄漏,如图1-1: 这张图是在APP进入首页并将数据加载完毕时截取的,可以看到,HandyJSON一共

在Activity中使用Thread导致的内存泄漏

原文链接 : Activitys, Threads, & Memory Leaks 原文作者 : AlexLockwood 译文出自 : 开发技术前线 www.devtf.cn 译者 : chaossss 校对者: yinna317 状态 : 完成 注:这篇博文涉及的源码可以在 GitHub 上面下载哦 做 Android 开发最常遇到的问题就是在 Activity 的生命周期中协调耗时任务,避免执行任务导致不易察觉的内存泄漏.不妨先读一读下面的代码,代码写了一个简单的 Activity,Act

常见的八种导致 APP 内存泄漏的问题(上)

百度搜索:小强测试品牌 QQ群:138269539 像 Java 这样具有垃圾回收功能的语言的好处之一,就是程序员无需手动管理内存分配.这减少了段错误(segmentation fault)导致的闪退,也减少了内存泄漏导致的堆空间膨胀,让编写的代码更加安全.然而,Java 中依然有可能发生内存泄漏.所以你的安卓 APP 依然有可能浪费了大量的内存,甚至由于内存耗尽(OOM)导致闪退. 传统的内存泄漏是由忘记释放分配的内存导致的,而逻辑上的内存泄漏则是由于忘记在对象不再被使用的时候释放对其的引用导

常见的八种导致 APP 内存泄漏的问题(下)

百度搜索:小强测试品牌 QQ群:138269539 Handlers 同 样的,定义一个匿名的 Runnable 对象并将其提交到 Handler 上也可能导致 activity 泄漏.Runnable 对象间接地引用了定义它的activity 对象,而它会被提交到 Handler 的 MessageQueue 中,如果它在 activity 销毁时还没有被处理,那就会导致 activity 泄漏了. Threads 同样的,使用 Thread 和 TimerTask 也可能导致 activit

解决android中EditText导致的内存泄漏问题

开发中用到了LeankCanary,在一个简单的页面中(例如 :仅仅 包含Edittext),也会导致内训泄漏,为此,我在网上找了大量资料,最终解决.例如一个布局:<LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:focusable="true"android:focusableInTouchMode=&qu

解决java.beans.Introspector导致的内存泄漏

解决方案: 在WEB.XML 中配置监听器: <listener> <listener-class> org.springframework.web.util.IntrospectorCleanupListener </listener-class> </listener> 原因: 在Web应用程序关闭时IntrospectorCleanupListener将会刷新JDK的JavaBeans的Introspector缓存.在你的web.xml中注册这个lis