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

简介: package cc.cc;import android.os.Bundle;import android.app.Activity;/** * Demo描述: * 非静态内部类可能导致的内存泄露及其优化 * * 在MainActivity中定义了两个内部类InnerClassTest和ThreadSubClass.
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();
	}

}

相关文章
|
23天前
|
存储 缓存 监控
|
28天前
|
缓存 算法 Java
Java中的内存管理:理解与优化
【10月更文挑战第6天】 在Java编程中,内存管理是一个至关重要的主题。本文将深入探讨Java内存模型及其垃圾回收机制,并分享一些优化内存使用的策略和最佳实践。通过掌握这些知识,您可以提高Java应用的性能和稳定性。
44 4
|
12天前
|
存储 JavaScript 前端开发
如何优化代码以避免闭包引起的内存泄露
本文介绍了闭包引起内存泄露的原因,并提供了几种优化代码的策略,帮助开发者有效避免内存泄露问题,提升应用性能。
|
13天前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
22天前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
27天前
|
数据处理 Python
如何优化Python读取大文件的内存占用与性能
如何优化Python读取大文件的内存占用与性能
88 0
|
2月前
|
Java Android开发 UED
安卓应用开发中的内存管理优化技巧
在安卓开发的广阔天地里,内存管理是一块让开发者既爱又恨的领域。它如同一位严苛的考官,时刻考验着开发者的智慧与耐心。然而,只要我们掌握了正确的优化技巧,就能够驯服这位考官,让我们的应用在性能和用户体验上更上一层楼。本文将带你走进内存管理的迷宫,用通俗易懂的语言解读那些看似复杂的优化策略,让你的开发之路更加顺畅。
55 2
|
3月前
|
存储 缓存 JSON
一行代码,我优化掉了1G内存占用
这里一行代码,指的是:String.intern()的调用,为了调用这一行代码,也写了几十行额外的代码。
|
3月前
|
机器学习/深度学习 数据采集 PyTorch
构建高效 PyTorch 模型:内存管理和优化技巧
【8月更文第27天】PyTorch 是一个强大的深度学习框架,被广泛用于构建复杂的神经网络模型。然而,在处理大规模数据集或使用高性能 GPU 进行训练时,有效的内存管理对于提升模型训练效率至关重要。本文将探讨如何在 PyTorch 中有效地管理内存,并提供一些优化技巧及代码示例。
92 1
|
3月前
|
Linux 测试技术 C++
内存管理优化:内存泄漏检测与预防。
内存管理优化:内存泄漏检测与预防。
55 2