【内存】

性能优化->虚拟机原理 怎么分析堆内存 内存泄露和内存溢出的原因 怎么做内存管理

JVM类加载机制
Java内存区域与内存溢出
垃圾回收算法
!Android GC 原理探究
Android 内存泄漏总结

内存溢出(OOM)

Android关于OOM的解决方案
1、什么是OOM
指Out of memory(内存溢出),应用当前占用的内存加上我们申请的内存资源超过了虚拟机对该应用的最大内存限制就会抛出Out of memory异常
程序所需要的内存超过了系统所能分配的内存(包括动态扩展)的上限。

2、OOM相关概念

  • 内存溢出:指程序在申请内存时,没有足够的空间供其使用
  • 内存泄漏:指程序分配出去的内存不再使用,但无法进行回收
  • 内存抖动:指程序短时间内大量创建对象,然后回收的现象

3、解决OOM
Bitmap相关

  • 图片压缩
  • 加载缩略图
  • 在滚动时不加载图片
  • 及时回收Bitmap
  • 使用inBitmap属性(将该属性设为true可以将BaseMemoryCache和LruMemoryCache结合使用, 先取Lru没有再取Base,因Base中的Cache很可能被回收)
  • 捕获异常

其他相关

  • listview重用convertView、使用lru
  • 避免在onDraw方法中执行对象的创建
  • 谨慎使用多进程

内存泄漏

Android内存泄漏总结

1、Java中引起内存泄漏的主要原因
内存泄漏是指分配出去的内存没有被回收回来,由于失去了对该内存区域的控制,因而造成了资源的浪费。Java中一般不会产生内存泄漏,因为有垃圾回收器自动回收垃圾,但这也不绝对,当我们new了对象,并保存了其引用,但是后面一直没用它,而垃圾回收器又不会去回收它,这就会造成内存泄漏。

长生命周期的对象持有短生命周期对象的引用

2、Java内存分配策略

静态存储区:又称方法区,主要存储全局变量和静态变量,在整个程序运行期间都存在
栈区:方法体的局部变量会在栈区得到分配空间,并在方法执行结束后自动释放变量得到的资源
堆区:保存动态产生的数据,如:new出来的对象和数组,在不使用的时候由Java回收器自动回收

3、Android解决内存泄漏的例子

  • 单例造成的内存泄漏:使用context.getApplicationContext()作为单例的context
  • 匿名内部类造成的内存泄漏:由于非静态内部类持有匿名外部类的引用,必须将内部类设置为static
  • Handler造成的内存泄漏:使用static的Handler内部类,同时在实现内部类中持有Context的弱引用
  • 避免使用static变量:由于static变量会跟Activity生命周期一致,当Activity退出后,被后台回收时,static变量是不安全,所以也要管理好static变量的生命周期
  • 资源未关闭造成的内存泄漏:比如Socket、Broadcast、Cursor、Bitmap、ListView等,使用完后要关闭
  • 【AsyncTask造成的内存泄漏】:由于非静态内部类持有匿名内部类的引用而造成内存泄漏,可以通过AsyncTask内部持有外部Activity的弱引用同时改为静态内部类或在onDestroy()中执行AsyncTask.cancel()进行修复

如何使用leakCanary

内存管理

1、Android内存管理机制

分配机制
管理机制

2、内存管理机制的特点

更少的占用内存
在合适的时候,合理的释放系统资源
在系统内存紧张的时候,能释放掉大部分不重要的资源

能合理的在特定生命周期中,保存或还原重要数据

3、内存优化方法

Service完成任务后应停止它,或用IntentService(因为可以自动停止服务)代替Service
在UI不可见的时候,释放其UI资源
在系统内存紧张的时候,尽可能多的释放非重要资源
避免滥用Bitmap导致内存浪费
避免使用依赖注入框架
使用针对内存优化过的数据容器
使用ZIP对齐的APK
使用多进程

JAVA内存区域

  1. 程序计数器
  2. Java虚拟机栈
  3. 本地方法栈
  4. Java堆
  5. 方法区
  6. 运行时常量池
  7. 直接内存

其它内存/JVM相关

Art和Dalvik的区别

ART代表Android Runtime,是google开发的执行效率更高更省电的替代运行时,其处理应用程序执行的方式完全不同于Dalvik。ART完全改变了这套做法,在应用安装的时候就预编译字节码到机器语言,这一机制叫Ahead-Of-Time(AOT)编译。在移除解释代码这一过程后,应用程序执行将更有效率,启动更快。
Dalvik是Google公司自己设计用于Android平台的Java虚拟机,是依靠一个Just-In-Time(JIT)编译器去解释字节码。开发者编译后的应用代码需要通过一个解释器在用户的设备上运行,这一机制并不高效,但让应用能更容易在不同硬件和架构上运行。它可以支持已转换为.dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik应用设计的一种压缩格式,适合内存和处理器速度有限的系统。Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik应用作为独立的Linux进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。

ART优点
系统性能的显著提升
应用启动更快、运行更快、体验更流畅、触感反馈更及时
更长的电池续航能力
支持更低的硬件
ART缺点
更大的存储空间占用,可能会增加10%-20%
更长的应用安装时间

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356

推荐阅读更多精彩内容