zoukankan      html  css  js  c++  java
  • Android内存泄露之开篇

    先来想这三个问题

    1. 内存泄露是怎么回事
    2. 内存会泄露的原因
    3. 避免内存泄露

    1.内存泄露怎么回事

    一个程序中,已经不须要使用某个对象,可是由于仍然有引用指向它垃圾回收器就无法回收它,当然该对象占用的内存就无法被使用,这就造成了内存泄露。
    Android的一个应用程序的内存泄露对别的应用程序影响不大。
    为了可以使得Android应用程序安全且高速的执行,Android的每一个应用程序都会使用一个专有的Dalvik虚拟机实例来执行,它是由Zygote服务进程孵化出来的。也就是说每一个应用程序都是在属于自己的进程中执行的。
    Android为不同类型的进程分配了不同的内存使用上限,假设程序在执行过程中出现了内存泄漏的而造成应用进程使用的内存超过了
    这个上限,则会被系统视为内存溢出。从而被kill掉,这使得只自己的进程被kill掉,而不会影响其它进程(假设是system_process等系统进程出问题的话,则会引起系统重新启动)
    

    2.出现内存泄露原因

    1.资源对象没关闭造成的内存泄露
        资源性对象比方(Cursor,File文件等)往往都用了一些缓冲,我们在不使用的时候,应该及时关闭它们。以便它们的缓冲及时回收内存
    2.变量的作用域不一样导致
      变量                              作用域 
      函数变量                           函数内
      成员变量                          整个对象内
      TLS(ThreadLocalStorage)           整个线程
      静态变量                          整个进场内
      Binder(IPC)                      进程间
    
     由于作用域的不同。作用域大引用到对象都可能不会立即销毁,所以会内存泄露。

    handle 的内存泄露主要 TLS变量和 activity的生命周期不一样,。

    Thread 引用其它对象也easy出现对象泄露。 3.内存压力过大 1.图片资源载入过多,超过内存使用空间,比如Bitmap 的使用 2.反复创建view,没有反复使用 listview,的使用

    3.怎样避免内存泄露

    1.良好的代码规范,清晰代码逻辑
    2.对于引用生命不一样的对象。能够用弱引用WeakReferner
    3.对于资源对象 使用finally 强制关闭
    4.内存压力过大就要统一的管理内存
    5.对象反复而且频繁调用能够考虑对象池。
  • 相关阅读:
    hive: insert数据时Error during job, obtaining debugging information 以及beyond physical memory limits
    hadoop性能调优
    mysql主键,外键,索引
    Hive语法
    Hbase配置java客户端
    Hive命令及操作
    sqoop:mysql和Hbase/Hive/Hdfs之间相互导入数据
    mysql字符设置
    linux及hadoop修改权限
    Scalaz(55)- scalaz-stream: fs2-基础介绍,fs2 stream transformation
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7142332.html
Copyright © 2011-2022 走看看