Android优化笔记-垃圾回收机制

1 了解什么是内存回收机制
  某对象不再有任何引用的时候才会进行回收。
 
 1.2 内存分配的几种策略
     1.2.1. 静态的
   静态的存储区:内存在程序编译的时候就已经分配好,这块的内存在程序整个运行期间都一直存在。它
主要存放静态数据,全局的static数据和一些常量。
    1.2. 2 栈式的: 在执行函数方法时,函数一些内部变量的存储都可以在栈上面创建,函数执行结束的时候这些
存储单元就会自动被释放掉。栈内存包括分配的运算速度很快,因为内置在处理器的里面。

  1.2.3 堆式的 
     也叫做动态内存分配。可以用malloc或者new 来申请分配一个内存。在C/C++可能需要自己负责则释放
(java里面直接依赖GC机制)。    
  
  堆与栈的区别:
  堆是不连续的内存区域,堆空间比较灵活也特别大。栈是一块连续的内存区域,大小是有操作系统决定的。一般情况,引用和对象都存在于堆上。临时变量存在于栈上。  
  
 2 类的成员变量全部存储在堆中(包括基本数据类型,引用及引用的对象实体),因为它们属于类,类对象最终还是被new出来的。局部变量的基本数据类型和引用存储于栈当中,引用的对象实体存储在堆中。因为他们属于方法当中的变量,生命周期会随着方法一起结束。
 
  对于内存泄漏,主要讨论堆内存,它存放的就是引用对象的对象实体。
  java中存在着四种引用。
  
      强引用 Strong Reference
      软引用 Soft Reference
      弱引用 Weak Reference
      虚引用 Phantom Reference
    
     强引用:比如Object obj= new Object(); 代码中普遍存在,只要强引用还在,
垃圾收集器永远不会回收掉被引用的对象。
     软引用: 用来描述一些还有用,但并非必须的对象。软引用所关联的对象,有在系统
将要发生内存溢出异常之前,将把这些对象列进回收范围,并进行第二次回收。如果这次回收
还是没有足够内存,才会抛出内存异常。
      弱引用: 弱引用的引用强度比软引用要更弱一些,无论内存是否足够,只要 JVM 开始
进行垃圾回收,那些被弱引用关联的对象都会被回收。     
      虚引用是最弱的一种引用关系,如果一个对象仅持有虚引用,那么它就和没有任何引用一
样,它随时可能会被回收,

 3 引用队列(ReferenceQueue)
        引用队列可以与软引用、弱引用以及虚引用一起配合使用,当垃圾回收器准备回收一个对象时,如果发现它还有引用,那么就会在回收对象之前,把这个引用加入到与之关联的引用队列中去。程序可以通过判断引用队列中是否已经加入了引用,来判断被引用的对象是否将要被垃圾回收,这样就可以在对象被回收之前采取一些必要的措施.与软引用、弱引用不同,虚引用必须和引用队列一起使用。

  Android内存回收机制
  默认回收机制:当系统内存不足时,系统将激活内存回收过程。为了不因内存回收影响用户体验(如杀死当前的活动进程),
  退出但不关闭:
     这是Android对于Linux的优化。当 Android 应用程序退出时,并不清理其所占用的内存,Linux 内核进程也相应的继续存在,所谓“退出但不关闭”。
      从而使得用户调用程序时能够在第一时间得到响应。应用切换到后台是暂停的,完全不耗cpu和电量,只保留了运行状态。如果app需要后台处理事务(放音乐),那么app进程会开启相应的服务,所以在后台有消耗的只有服务.占用CPU的应用才耗电,后台的只占内存,所以是不耗电的。
  回收优先级:
  Android 基于进程中运行的组件及其状态规定了默认的五个回收优先级:
  IMPORTANCE_FOREGROUND:前台进程,目前正在屏幕上显示的进程和一些系统进程。
  IMPORTANCE_VISIBLE:可见进程,可见进程是一些不再前台,但用户依然可见的进程,比如输入法、天气、时钟等。
  IMPORTANCE_SERVICE:服务进程,拨号、邮件存储之类的。
  IMPORTANCE_BACKGROUND:后台进程,启动后被切换到后台的进程。
  IMPORTANCE_EMPTY:没有任何东西在内运行的进程,有些程序,比如BTE,在程序退出后,依然会在进程中驻留一个空进程,这个进程里没有任何数据在运行,作用往往是提高该程序下次的启动速度或者记录程序的一些历史信息。
   
   触发内存回收的阈值:
  进行内存调度有个阀值,只有低于这个值系统才会按一个列表来关闭用户不需要的东西。
  为什么内存少的时候运行大型程序会慢呢,原因是:在内存剩余不多时打开大型程序时会触发系统自身的调进程调度策略,这是十分消耗系统资源的操作,特别是在一个程序频繁向系统申请内存的时候。这种情况下系统并不会关闭所有打开的进程,而是选择性关闭,频繁的调度自然会拖慢系统。

 常见垃圾收集算法: 1 标记-清除算法  2 复制算法   3 标记-整理算法     4 分代收集算法。

你可能感兴趣的:(android)