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异常与性能优化相关面试问题-内存泄漏面试问题讲解的更多相关文章

  1. Android异常与性能优化相关面试问题-内存管理面试问题详解

    内存管理机制概述: 分配机制:操作系统会为每一个进程分配一个合理的内存大小,从而保证每一个进程能够正常的运行,不至于内存不够使用,或者某个进程占用过多的内存. 回收机制:在系统内存不足的时候,系统有一 ...

  2. Android异常与性能优化相关面试问题-OOM异常面试问题详解

    什么是OOM? 当前占用的内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存限制就会抛出Out Of Memory异常. 一些容易混淆的概念: 内存溢出:指的就是OOM. 内存抖动:是短时间 ...

  3. Android异常与性能优化相关面试问题-ui卡顿面试问题详解

    UI卡顿原理: “60fps(Frames Per Second每秒传输帧数) ----> 16ms” 针对上面标红的数字,下面具体说明一下:最主要的根源在于渲染性,Android会每隔16ms ...

  4. Android异常与性能优化相关面试问题-其他优化面试问题详解

    Android不用静态变量存储数据: 静态变量等数据由于进程已经被杀死而被初始化.在Android中应用进程不是安全的,因为它会有系统给kill掉,但是在实际中可能会有这样的一个假象:当app被杀掉之 ...

  5. Android异常与性能优化相关面试问题-冷启动优化面试问题详解

    什么是冷启动: 冷启动的定义:冷启动就是在启动应用前,系统中没有该应用的任何进程信息.实际也就是要执行Application.onCreate()方法的那次启动. 冷启动 / 热启动的区别:热启动:用 ...

  6. Android异常与性能优化相关面试问题-ANR异常面试问题详解

    什么是ANR? Application Not Responding 造成ANR的主要原因: 应用程序的响应性是由ActivityManager和WindowManager系统服务监视的,当监视到在A ...

  7. Android异常与性能优化相关面试问题-bitmap面试问题详解

    recycle: 对于Bitmap来说内存分为Java内存和Native内存,而当图片不用时建议调用一下recycle()方法来将native层的内存进行回收,下面看一下它的源码官方对它的解释: LR ...

  8. Android性能优化之常见的内存泄漏

    前言 对于内存泄漏,我想大家在开发中肯定都遇到过,只不过内存泄漏对我们来说并不是可见的,因为它是在堆中活动,而要想检测程序中是否有内存泄漏的产生,通常我们可以借助LeakCanary.MAT等工具来检 ...

  9. 转——Android应用开发性能优化完全分析

    [工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉 ...

随机推荐

  1. QTP的安装(转载)

    1.WIndows10安装QTP时需注意版本的要求. 2.安装参考 下载链接:https://download.csdn.net/download/weixin_41479750/11240466 下 ...

  2. 论UT阶段重要性

    测试与开发这对立的命运啊 如果是对测试从业者心存鄙视的朋友啊,请关掉此页,带着偏见不好看的~ 人生就像一个旅途,每个人看到风景不一样,世界观.人生观.价值观也就不同.不要试着去改变别人,因为你的观点在 ...

  3. BiGAN的复现

    数据集是10000个样本,前8000个训练集,后面的用来测试.每个样本是1*144(重构成12*12的矩阵),将原始BiGAN有编码器.判别器和生成器,将里面的全连接层全部替换成了卷积. from _ ...

  4. Leetcode之动态规划(DP)专题-123. 买卖股票的最佳时机 III(Best Time to Buy and Sell Stock III)

    Leetcode之动态规划(DP)专题-123. 买卖股票的最佳时机 III(Best Time to Buy and Sell Stock III) 股票问题: 121. 买卖股票的最佳时机 122 ...

  5. spring-cloud-starter-stream-rocketmq 坑点j记录

  6. element UI实现动态生成多级表头

    一.效果图 二.封装两个组件,分别为DynamicTable.vue和TableColumn.vue,TableColumn.vue主要是使用递归来对表头进行循环生成 DynamicTable.vue ...

  7. ubuntu下不能访问docker中的rabbitmq服务端口

    主要原因是防火墙屏蔽了15672端口,宿主机就不能直接通过 ip:port的形式访问rabbitmq的管理界面了. 解决方法很简单: 设置防火墙规则,使外部主机能够访问虚拟机的15672端口. 启动i ...

  8. git 命令 git status add rm commit mv

    1.查看 git 仓库文件改动状态 Git 仓库内文件改动有 4 种状态,除了 Unmodified 状态的文件因为并未改动默认没有状态不做显示之外,其他文件改动状态都可以通过 git status ...

  9. Python全栈开发之6、面向对象

    一.创建类和对象 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例 ...

  10. 进行hcmcloud 数据库备份以及设置的处理过程.

    导入数据库以及简单设置. 最近进行了一个数据库备份的简单工作: create database hcmcloud create user hcm with password 'Test6530' 执行 ...