【内存】

作者: 小呀么小黄鸡 | 来源:发表于2018-02-24 09:47 被阅读18次

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

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

    内存溢出(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中引起内存泄漏的主要原因

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

    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%
    更长的应用安装时间

    相关文章

      网友评论

        本文标题:【内存】

        本文链接:https://www.haomeiwen.com/subject/yedczxtx.html