Android 内存优化详解 Android 内存泄露 前言 不少人认为JAVA 程序,因为有垃圾回收机制,应该没有内存泄露。 其实如果我们一个程序中,已经不再使用某个对象,但是因为仍然有引用指向它,垃圾回收器就无法回收它,当然该对象占用的内存就无法被使用,这就造成了内存泄露。如果我们的java 运行很久,而这种内存泄露不断的发生,最后就没内存可用了。当然 java 的,内存泄漏和 C/C++是不一样的。如果 java 程序完全结束后,它所有的对象就都不可达了,系统就可以对他们进行垃圾回收,它的内存泄露仅仅限于它本身,而不会影响整个系统的。C/C++的内存泄露就比较糟糕了,它的内存泄露是系统级,即使该C/C++程序退出,它的泄露的内存也无法被系统回收,永远不可用了,除非重启机器。 Android 的一个应用程序的内存泄露对别的应用程序影响不大。为了能够使得 Android 应用程序安全且快速的运行,Android 的每个应用程序都会使用一个专有的 Dalvik 虚拟机实例来运行,它是由 Zygote 服务进程孵化出来的,也就是说每个应用程序都是在属于自己的进程中运行的。Android 为不同类型的进程分配了不同的内存使用上限,如果程序在运行过程中出现了内存泄漏的而造成应用进程使用的内存超过了这个上限,则会被系统视为内存泄漏,从而被 kill 掉,这使得仅仅自己的进程被 kill 掉,而不会影响其他进程(如果是system_process 等系统进程出问题的话,则会引起系统重启)。 1 ,引用没释放造成的内存泄露 1 .1 注册没取消造成的内存泄露 这种 Android 的内存泄露比纯 java 的内存泄露还要严重,因为其他一些 Android 程序可能引用我们的 Anroid 程序的对象(比如注册机制)。即使我们的 Android 程序已经结束了,但是别的引用程序仍然还有对我们的 Android 程序的某个对象的引用,泄露的内存依然不能被垃圾回收。 比如示例 1: 假设我们希望在锁屏界面(LockScreen)中,监听系统中的电话服务以获取一些信息(如信号强度等),则可以在 LockScreen 中定义一个 PhoneStateListener 的对象,同时将它注册到 TelephonyManager 服务中。对于 LockScreen 对象,当需要显示锁屏界面的时候就会创建一个 LockScreen 对象,而当锁屏界面消失的时候 LockScreen 对象就会被释放掉。 但是如果在释放 LockScreen 对象的时候忘记取消我们之前注册的 PhoneStateListener对象,则会导致 LockScreen 无法被垃圾回收。如果...