Android异常与性能优化相关面试问题-内存泄漏面试问题讲解
Java内存泄漏基础知识:
- Java的内存的分配策略
a、静态存储区:也叫方法区,主要是存放一些静态数据及全局变量等,在程序编译时就已经分配好了,并且在静态存储区中存放的变量在整个程序运行期间都存在。
b、栈区:执行方法时,方法中的局部变量会在栈上创建内在空间,并在方法执行结束之后这些变量及所持有的内存会自动释放。因为栈内存分配运算内置于处理器当中,所以效率很高,但是栈区的容量有限。
c、堆区:也就动态内存分配,通常是我们new出来的内存,在不使用时会由java回收器来负责回收。 - Java是如何管理内存的
是由虚拟器GC来释放的,为了能够正确的释放对象,必须监控每个对象的运行状态,包括对像的申请、引用、被引用、复制等等,下面来看一张图更好的理解GC的工作原理:
其中main是根顶点,根顶点可达的对象都是有效的对象,如图o1、o2,GC的时候是不会回收这些对象的,而Obj2是根顶点不可达到的对象,所以说这个对象是可以被回收的。
- Java中的内存泄漏
内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成的内存空间的浪费。
Android内存泄漏:
- 单例:
修复方法:

- 匿名内部类:

修复如下:
- handler:
而之所有上面的写法会存在泄漏,是由于是消息队列在一个Looper线程中不断的轮循处理消息,当MainActivity退出的时候消失队列中还有未处理的消息或正在处理的消息,而消息队列中的Message持有了mHandler的实例引用,而mHandler又持有MainActivity的引用,所以就容易造成泄漏了。
修复如下:
- 避免使用static变量:
由于static变量在app退出时也不会被释放,根据app内存管理机制,占内存较大的进程将优先被回收,如果app被回收那存在的变量是不安全的,避免的方法就是可以使用懒加载避免使用static,如果非要使用那一定要对这类静态变量的生命周期进行管理。 - 资源未关闭造成的内存泄漏:
如广播、cursor、Bitmap、contentProvider等。 - AsyncTask造成的内存泄漏:
在onDestroy()中主动调用一下cancel方法。 - Bitmap不用时需要调用recycle()方法将C区的内存进行释放。
Android异常与性能优化相关面试问题-内存泄漏面试问题讲解的更多相关文章
- Android异常与性能优化相关面试问题-内存管理面试问题详解
内存管理机制概述: 分配机制:操作系统会为每一个进程分配一个合理的内存大小,从而保证每一个进程能够正常的运行,不至于内存不够使用,或者某个进程占用过多的内存. 回收机制:在系统内存不足的时候,系统有一 ...
- Android异常与性能优化相关面试问题-OOM异常面试问题详解
什么是OOM? 当前占用的内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存限制就会抛出Out Of Memory异常. 一些容易混淆的概念: 内存溢出:指的就是OOM. 内存抖动:是短时间 ...
- Android异常与性能优化相关面试问题-ui卡顿面试问题详解
UI卡顿原理: “60fps(Frames Per Second每秒传输帧数) ----> 16ms” 针对上面标红的数字,下面具体说明一下:最主要的根源在于渲染性,Android会每隔16ms ...
- Android异常与性能优化相关面试问题-其他优化面试问题详解
Android不用静态变量存储数据: 静态变量等数据由于进程已经被杀死而被初始化.在Android中应用进程不是安全的,因为它会有系统给kill掉,但是在实际中可能会有这样的一个假象:当app被杀掉之 ...
- Android异常与性能优化相关面试问题-冷启动优化面试问题详解
什么是冷启动: 冷启动的定义:冷启动就是在启动应用前,系统中没有该应用的任何进程信息.实际也就是要执行Application.onCreate()方法的那次启动. 冷启动 / 热启动的区别:热启动:用 ...
- Android异常与性能优化相关面试问题-ANR异常面试问题详解
什么是ANR? Application Not Responding 造成ANR的主要原因: 应用程序的响应性是由ActivityManager和WindowManager系统服务监视的,当监视到在A ...
- Android异常与性能优化相关面试问题-bitmap面试问题详解
recycle: 对于Bitmap来说内存分为Java内存和Native内存,而当图片不用时建议调用一下recycle()方法来将native层的内存进行回收,下面看一下它的源码官方对它的解释: LR ...
- Android性能优化之常见的内存泄漏
前言 对于内存泄漏,我想大家在开发中肯定都遇到过,只不过内存泄漏对我们来说并不是可见的,因为它是在堆中活动,而要想检测程序中是否有内存泄漏的产生,通常我们可以借助LeakCanary.MAT等工具来检 ...
- 转——Android应用开发性能优化完全分析
[工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉 ...
随机推荐
- lua学习笔记1--基础语法
print("打印日志");--单行注释 --[[ 多行注释 --]] a = --变量的类型,是由变量储存的数据决定 数据类型: number:数值类型,可以存储整数和小数 bo ...
- ASP.NET Core 入门笔记9,ASP.NET Core + Entity Framework Core 数据访问入门
一.前言 1.本教程主要内容 ASP.NET Core MVC 集成 EF Core 介绍&操作步骤 ASP.NET Core MVC 使用 EF Core + Linq to Entity ...
- MariaDB知识点总结02--日志+备份
一.日志 1.查询日志 记录每一条sql语句,建议不开启,因为如果访问量较大,会占用相当大的资源,影响性能; vim /etc/my.cnf.d/server.cnf general_log = ON ...
- Summary of OAuth 2.0
Summary of OAuth 2.0 1 Problems: This pattern of applications obtaining user passwords obviously has ...
- css 未知子元素宽高的居中
.parent{ position:relative; } .child{ position:absolute; left:50%; top:50%; transform:translate(-50% ...
- 动态加载js不执行解决办法
这个问题的产生原因是:我们项目有一个主index文件,在主index文件中需要根据参数来判断是加载pc.html的内容还是加载mobile.html的内容,一开始是使用jquery来做的,没有问题,后 ...
- *【Python】【demo实验26】【练习实例】【递归方法的使用】
原题: 利用递归方法求5! 原题给出的解答: #!/usr/bin/python # encoding=utf-8 # -*- coding: UTF-8 -*- # 利用递归方法求5! def fa ...
- #######【Python】【基础知识】【标准库】目录及学习规划 ######
下述参考Python DOC https://docs.python.org/zh-cn/3/library/index.html 概述 可用性注释 内置函数 内置常量 由 site 模块添加的常量 ...
- Spring之一:IoC容器体系结构
温故而知心. Spring IoC概述 常说spring的控制反转(依赖反转),看看维基百科的解释: 如果合作对象的引用或依赖关系的管理要由具体对象来完成,会导致代码的高度耦合和可测试性降低,这对复杂 ...
- 用python实现自己的http服务器——多进程、多线程、协程、单进程非堵塞版、epoll版
了解http协议 http请求头 GET / HTTP/1.1 Host: www.baidu.com Connection: keep-alive Pragma: no-cache Cache-Co ...