给你讲讲Android里的内存泄露,说简单点就是把不该用的对象死扣在内存里不撒手,垃圾回收器找不到理由下手,内存就慢慢被吃掉。要搞懂这个,得先了解Java管内存的那套办法。Java搞了个“双保险”,先是看引用次数,对象被引用了就加一,引用断了就减一,结果就是因为互相拿着对方的把柄导致计数永远不为零,GC根本动不了;然后又用GC Roots顺着线往下查,发现某条线断了就证明没人用了。只要这玩意儿还被强引用或者软引用拽着,不管它能不能用都是个麻烦。 最容易藏猫腻的地方主要有三块。一是static修饰的对象,像单例这种一旦被static缠上就跟应用绑在一起了;二是那些长连接或者资源没关的情况,比如数据库连接或者Socket这种只要不关就一直占着;三是ArrayList这种集合类容易出岔子,clear只是把长度置零了底下的数组还在呢。 要想查出问题,先用Android Studio的Profiler抓个Heap Dump看看是不是到了OOM临界点;再装上LeakCanary这种库自动帮你抓责任链;最后还得手动沿着GC Roots倒着追引用链。发现问题后要么把拿着的变量设成null,要么改成弱引用。 总之记住了:对象没了还被强引用就是泄露。只要顺着这条主线去查,再加上Dump工具就能提前把隐患给消灭。毕竟早点把没用的对象释放出来,App才能跑得更稳用户才更愿意用。