安卓的内存泄漏问题总结
来源:互联网 发布:windows 10 介质 编辑:程序博客网 时间:2024/06/05 20:23
安卓的虚拟机是基于寄存器的Dalvik虚拟机,它的最大堆内存大小为16M,有的机器为24M,因此我们利用的内存空间是有限的。如果我们的内存占用超过一定的水平就会出现outofmemory的错误。
内存溢出的情况有如下几点:
1.释放资源问题
程序代码的问题,如果长期持有Context、Cursor、IO流的引用,资源得不到释放造成内存泄漏
2.内存对象过大的问题
保存多个耗用内存过大的对象如:Bitmap、XML文件,造成内存超出限制。
3.static关键字的使用问题
static是JAVA的关键字,当他用来修饰成员变量时,那么该变量就属于该类,而不是该类的实例。所以用static修饰的变量他的生命周期很长,如果用他引用一些耗资源的实例就要谨慎使用。
public class Test { private static Context context;}
以上代码很危险,如果将Activity赋值到context的话,那么即使该Activity已经onDestroy,但由于对象保存它的引用,因此该Activity依然不会得到释放。
4.线程导致内存溢出
线程产生的内存泄漏主要原因在于线程周期的不可控。
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new MyTread.start(); } private class <span style="font-family: Arial, Helvetica, sans-serif;">MyTread </span><span style="font-family: Arial, Helvetica, sans-serif;">extends Thread{</span> @Override public void run() { super.run(); } }}当我们横屏变竖屏是,如果没有设置config方法则会重新销毁Activity在创建一个新的,但是MyThread持有activity的引用,当MyThread的run函数没有结束的时候MyThread是不会被销毁的,因此activity也不会被销毁,就出现了内存泄漏问题。
解决办法:
将线程的内部类,改为静态内部类
在线程内部采用弱引用保存context的引用
0 0
- 安卓的内存泄漏问题总结
- 安卓内存泄漏
- 安卓-Handler引起的内存泄漏
- 内存泄漏问题总结
- 内存泄漏问题总结
- 安卓中的内存泄漏
- 安卓内存泄漏相关
- 安卓Handler内存泄漏
- 安卓 内存泄漏 MemoryAnalyzer
- IE内存泄漏问题总结
- 安卓常见的内存泄漏实例以及解决办法
- spring集成quartz的内存泄漏问题总结
- android内存泄漏的总结
- LeakCanary检测安卓内存泄漏
- 安卓简单技术-内存泄漏(OOM)
- LeakCanary检测安卓中的内存泄漏
- 安卓内存泄漏简析
- 安卓 内存 泄漏 工具 LeakCanary 使用
- 构建单页Web应用
- Linux重启网络
- 前端速学成财:第八课-速玩JS文件合并和压缩
- OpenWrt挂载U盘安装软件注意事项
- 安装ElasticSearch
- 安卓的内存泄漏问题总结
- Makefile和shell的区别:echo和@echo
- servlet API 解耦访问和耦合访问的区别
- 给11gR2 RAC添加LISTENER监听器并静态注册
- 将Eclipse中的工程保存到Github的操作步骤
- CSDN有奖任务答案!!!
- 【51nod】1302 矩形面积交【优先队列贪心】
- 字典数组
- 错误日志