Android性能优化之内存泄漏

性能优化:

1,如何去优化自己现有的项目,运行更加流畅。

app进程 16M,32M,64M

2,以后开发项目的时候就要从一开始就要做好。

-----------------------------内存泄漏----------------------------------------

C/C++自己去分配内存和释放内存----手动管理

malloc free

什么是内存泄漏,内存不在GC掌控之中,当一个对象已经不再使用了,本该被回收时,

而有另外一个正在使用的对象持有它的引用,从而就导致对象无法被回收。

这种导致了本该被回收的对象不能被回收,而停留在堆内存中,就产生了内存泄漏。

了解java内存回收机制:某对象不再有任何引用的时候才会进行回收。

 

了解内存分配的几种策略。

1,静态的

      静态的存储区,内存在程序编译的时候已经分配好,这块内存在程序整个运行期间都一直存在。

      它主要存放静态数据,全局的static数据和一些常量。

2,栈式的。

      在执行函数(方法)的时候,函数一些内部变量的存储都可以放在栈上面创建,函数执行结束

      的时候这些存储单元,就会自动释放掉。

      栈内存包括分配的运算速度很快,因为内置处理器的内部。当然容量比较有限。

3,堆式的

      也叫做动态内存分配。有时候可以用malloc或者new来申请分配一个内存,在c/c++可能要自己负责

      释放(java中直接以来gc的机制)

      在c/c++中是可以自己掌控内存的,需要有很高的素养来解决内存的问题,java这一块没有很好的方法

      来解决垃圾内存,需要的时候编程的时候就要注意自己良好的编程习惯。

区别:

      堆是一些不连续的内存区域,堆空间比较灵活,也比较大。

      栈是一些连续的内存空间,大小是操作系统决定的。

      堆管理很麻烦,频繁的new/remove会造成大量的内存碎片,这样就会慢慢导致效率低下。

      对于栈的话,他先进后出,进出完全不会产生碎片,运行效率很高,且稳定。

public class Main{

      int a = 1; // 堆中 成员变量

      Student a = new Student(); // 堆中 成员变量

      public void XXX(){

          int b = 2; // 栈中 局部变量

          Student b = new Student(); // 局部变量

      }

}

1,成员变量全部存储在堆中,(包括基本数据类型,引用的对象实体)----因为他们属于类,

      类对象最终还是要被new出来的。

2,局部变量的基本数据类型和引用存储于栈当中,引用的对象实体也是存储在堆当中,----

      因为他们属于方法中的变量。生命周期会随着方法一起结束。

 

我们讨论的内存泄漏,主要是堆内存,它存放的就是引用指向的对象实体。

 

软引用,若引用,虚引用,

有时候确实会有一种情况,当需要的时候可以访问,当不需要的时候可以被回收,也可以被暂时

保存,以备重复使用,

比如:listView或者GirdView,RecycleView加载大量数据或者图片的时候,图片非常占用内存,

不然很容易造成内存溢出,滑出去的内存就回收,节省内存,看listView的源码-----回收对象

还会重用convertView,如果用户反复滑动或者下面还有同样的图片,就会造成多次重复IO(很耗时)

那么需要缓存,----平衡好内存大小和IO,算法和一些特殊的java类。

算法:LRUcache(最近最少使用先回收)

特殊的java类:利于回收,StrongReference,SofeReference,WeakReference,PhantomReference.

 

StrongReference 强引用,

      回收时机:从不回收,使用,对象的一般保存,生命周期:JVM停止的时候才会终止,

SofeReference.    软引用,

      回收时机:当内存不足的时候,使用,SofeReference<String>结合ReferenceQueue构造,有效期短。

      生命周期:内存不足时终止。

WeakReference.  弱引用,

      回收时机:在来及回收的时候GC的时候,使用,同软引用,生命周期:GC后终止。

PhantomReference 虚引用

      回收时机:在垃圾回收的时候,使用,结合ReferenceQueue来跟踪对象被垃圾回收器回收的活动,

      生命周期:GC后终止。

开发时,为了防止内存溢出,处理一些占用内存大并且生命周期长的对象的时候,可以尽量使用软引用

和若引用,

软引用比LRU算法更加任性,回收量是比较大,你无法控制回收哪些对象。

比如使用的场景,默认头像,默认图标,

listView或者GirdView,RecycleView要使用内存缓存,外部缓存(SD卡)

-----------------------------------内存泄漏例子-------------------------------------------

单例模式导致内存对象无法释放而导致内存泄漏。

 

 

 

 

 

 

 

 

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值