Android性能优化篇(一),什么是内存泄露

来源:互联网 发布:linux terminal 复制 编辑:程序博客网 时间:2024/05/01 22:29

一直考虑是否要把自己所学的东西写到博客上,是否又太浪费时间?自己在印象笔记上做笔记不是挺好的嘛?最终还是决定在博客上写。

一直是菜鸡,希望时过境迁,一只菜鸡也能逆袭。不罗嗦了,直接上车。

主要是经验——车技。

1、我们知道一个app进程在安装的时候就会给该app分配一个固定的内存,比如32M或者64M,这就是为什么app用久就会卡

2、当你们优化老项目代码的时候,是不是有种想直接把老代码干掉,直接来写?所以以偶胡开发项目的时候从一开始就摆好车技

3、什么是内存泄露呢?C/C++中靠程序员自己去分配内存和释放内存,用malloc  free等操作。而java中,是GC自动帮你清理内存,所以内存泄露就是:内存不在GC掌控之内了。当一个对象已经不需要再使用了,本该被回收时,而有另外一个正在使用的对象持有它的引用从而就导致对象不能被回收。这种导致了本该被回收的对象不能被回收而停留在堆内存中,就产生了内存泄漏。当某对象不在有任何的引用的时候就是GC的内存会说机制

了解内存中分配的几种策略:

1、静态的

      内存在程序编译的时候就已经分配好,这块内存在程序整个运行都一直存在,除非当整个应用程序都销毁掉。一般都是static修饰

2、栈士的

      在执行方法时,函数的一些内部变量的存储都可以放在栈上创建,方法执行完后性和谐存储单元就会自动被释放掉。

3、堆士的

     也叫动态内存分配。是无序的,通常是通过malloc或者new来申请分配一个内存。在java中由GC自己释放。

区别:堆是不连续的内存区域,堆空间比较灵活也特别大。
             栈式一块连续的内存区域,大小是有操作系统觉决定的。

结论:堆管理很麻烦,频繁地new/remove会造成大量的内存碎片,这样就会慢慢导致效率低下。
            对于栈的话,他先进后出,进出完全不会产生碎片,运行效率高且稳定。

成员变量全部存储在堆中(包括基本数据类型,引用及引用的对象实体)---因为他们属于类,类对象最终还是要被new出来的。
局部变量的基本数据类型和引用存储于栈当中,引用的对象实体存储在堆中。-----因为他们属于方法当中的变量,生命周期会随着方法一起结束。

平时我们所讨论内存泄露,主要讨论堆内存,他存放的就是引用指向的对象实体。有时候确实会有一种情况:当需要的时候可以访问,当不需要的时候可以被回收也可以被暂时保存以备重复使用。

比如:ListView或者GridView、REcyclerView加载大量数据或者图片的时候,
    图片非常占用内存,一定要管理好内存,不然很容易内存溢出。
    滑出去的图片就回收,节省内存。看ListView的源码----回收对象,还会重用ConvertView。
    如果用户反复滑动或者下面还有同样的图片,就会造成多次重复IO(很耗时),
    那么需要缓存---平衡好内存大小和IO,算法和一些特殊的java类。
    算法:lrucache(最近最少使用先回收)

特殊的java类:利于回收,StrongReference,SoftReference,WeakReference,PhatomReference

StrongReference强引用:
    回收时机:从不回收 使用:对象的一般保存  生命周期:JVM停止的时候才会终止
SoftReference,软引用
    回收时机:当内存不足的时候;使用:SoftReference<String>结合ReferenceQueue构造有效期短;生命周期:内存不足时终止
WeakReference,弱引用
    回收时机:在垃圾回收的时候;使用:同软引用; 生命周期:GC后终止
PhatomReference 虚引用
    回收时机:在垃圾回收的时候;使用:合ReferenceQueue来跟踪对象呗垃圾回收期回收的活动; 生命周期:GC后终止

开发时,为了防止内存溢出,处理一些比较占用内存大并且生命周期长的对象的时候,可以尽量使用软引用和弱引用。
软引用比LRU算法更加任性,回收量是比较大的,你无法控制回收哪些对象。


内存碎片

内存碎片:是每次都有释放,不过释放的时间不同就会产生内存碎片,比如说,在内存单元100的起始地址到内存单元200之间,一共申请了100块1字节的区域,但是释放的时候,先释放了内存地址为基数的单元,如释放101、103...而偶数单元不释放,释放50次后,虽然还有50字节的内存是空余的,但是如果下次要申请2字节的内存单元,是无法在100到200之间申请到的,因为这个区域没有连续的2字节空间,这就是内存碎片。

好了学习笔记结束,下一个笔记是内存泄露的举例说明。PS:我这里写的是笔记,全当自己的学习历程,所以你看的懂就看,觉得写的不好,那你就笑一笑就好。



0 0
原创粉丝点击