没有合适的资源?快使用搜索试试~ 我知道了~
分析Android内存泄漏的几种可能
0 下载量 16 浏览量
2021-01-20
10:16:34
上传
评论
收藏 180KB PDF 举报
温馨提示
试读
5页
前言 内存泄漏简单地说就是申请了一块内存空间,使用完毕后没有释放掉。它的一般表现方式是程序运行时间越长,占用内存越多,最终用尽全部内存,整个系统崩溃。由程序申请的一块内存,且没有任何一个指针指向它,那么这块内存就泄露了。 从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积,这会最终消耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到。 Java是垃圾回收语言的一种,其优点是开发者无需特意管理内存分配,降低了应
资源详情
资源评论
资源推荐
分析分析Android内存泄漏的几种可能内存泄漏的几种可能
前言前言
内存泄漏简单地说就是申请了一块内存空间,使用完毕后没有释放掉。它的一般表现方式是程序运行时间越长,占用内存越
多,最终用尽全部内存,整个系统崩溃。由程序申请的一块内存,且没有任何一个指针指向它,那么这块内存就泄露了。
从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害
的是内存泄漏的堆积,这会最终消耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆
积,而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到。
Java是垃圾回收语言的一种,其优点是开发者无需特意管理内存分配,降低了应用由于局部故障(segmentation fault)导致崩
溃,同时防止未释放的内存把堆栈(heap)挤爆的可能,所以写出来的代码更为安全。
不幸的是,在Java中仍存在很多容易导致内存泄漏的逻辑可能(logical leak)。。如果不小心,你的Android应用很容易浪费掉未
释放的内存,最终导致内存用光的错误抛出(out-of-memory,OOM)
一般内存泄漏一般内存泄漏(traditional memory leak)的原因是的原因是:当该对象的所有引用都已经释放了,对象仍未被释放。(译者注:Cursor
忘记关闭等)
逻辑内存泄漏逻辑内存泄漏(logical memory leak)的原因是的原因是:当应用不再需要这个对象,当仍未释放该对象的所有引用。
如果持有对象的强引用,垃圾回收器是无法在内存中回收这个对象。
在Android开发中,最容易引发的内存泄漏问题的是最容易引发的内存泄漏问题的是Context。比如Activity的Context,就包含大量的内存引用,例如View
Hierarchies和其他资源。一旦泄漏了Context,也意味泄漏它指向的所有对象。Android机器内存有限,太多的内存泄漏容易导
致OOM。
检测逻辑内存泄漏需要主观判断,特别是对象的生命周期并不清晰。幸运的是,Activity有着明确的生命周期,很容易发现泄
漏的原因。Activity.onDestroy()被视为Activity生命的结束,程序上来看,它应该被销毁了,或者Android系统需要回收这些内存
(译者注:当内存不够时,Android会回收看不见的Activity)。
如果这个方法执行完,在堆栈中仍存在持有该Activity的强引用,垃圾回收器就无法把它标记成已回收的内存,而我们本来目
的就是要回收它!
结果就是Activity存活在它的生命周期之外。
Activity是重量级对象,应该让Android系统来处理它。然而,逻辑内存泄漏总是在不经意间发生。(译者注:曾经试过一个
Activity导致20M内存泄漏)。在Android中,导致潜在内存泄漏的陷阱不外乎两种:
全局进程全局进程(process-global)的static变量。这个无视应用的状态,持有Activity的强引用的怪物。
活在Activity生命周期之外的线程。没有清空对Activity的强引用。
检查一下你有没有遇到下列的情况。
Static Activities
在类中定义了静态Activity变量,把当前运行的Activity实例赋值于这个静态变量。
如果这个静态变量在Activity生命周期结束后没有清空,就导致内存泄漏。因为static变量是贯穿这个应用的生命周期的,所以
被泄漏的Activity就会一直存在于应用的进程中,不会被垃圾回收器回收。
static Activity activity;
void setStaticActivity() {
activity = this;
}
View saButton = findViewById(R.id.sa_button);
saButton.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
setStaticActivity();
nextActivity();
}
});
weixin_38655309
- 粉丝: 5
- 资源: 905
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- python:利用matplotlib绘制直方图
- 基于matlab块匹配全景图像拼接系统代码12
- 基于matlab小波变换图像融合系统代码11
- 精雕3.5NC后置文件
- yolov8n-pose.pt 用 yolov8n-pose.onnx下载
- C++之STL的vector详解,包括初始化和各种函数:vector的初始化、数据的增删查改等
- stable-diffusion-webui-master
- openPLC-Editor C语言编程 在mp157 arm板上调用io等使用记录
- 无人机悬停时间计算软件.rar
- 主要讲解 mybatis中 实体层的属性与表的列不一致时如何处理? 可以采用将列重命名方法还可以采用resultMap 方式
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0