2020-02-08 Android 内存溢出和内存泄漏

Android 内存管理

android 应用层中由java 开发,android 的davlik虚拟机与jvm 类似,只不过它是基于寄存器。

在java 中,通过 new 为对象分配内存,所有对象在java 堆内分配空间;而内存的释放是由垃圾收集器    GC 来回收。

内存溢出(out of memory)

系统会给每个App分配内存也就是Heap size值, 当APP所需要的内存大于了系统分配的内存,就会造成内存溢出;通俗点就是10L桶只能装10L水,但是你却用来装11L的水,那就有1L的水就会溢出

内存泄漏:

当一个对象不在使用了,本应该被垃圾回收器(JVM)回收,但是这个对象由于被其他正在使用的对象所持有,造成无法被回收的结果,通俗点就是系统把一定的内存值A借给程序,但是系统却收不回完整的A值,那就是内存泄漏。

两者关系:

内存试漏是造成内存溢出OOM 的主要原因,因为系统分配给每个程序 的内存就是 Heap size的值都是有限的,当内存泄漏到一定值时候, 最终会发生程序所需要的内存值加上泄漏值大于了系统所分配的内存 额度,就是触发内存溢出。

危害:

内存溢出:会触发Java.lang.OutOfMemoryError,造成程序崩溃

内存泄漏:过多的内存泄漏会造成OOM的发送,同样也会造成相关UI的卡顿现象

处理:

1 、大量的图片,音频视频、处理当内存比较低的系统上也容易造成内存溢出建议使用第三方,或者JNI进行处理。

2、Bitmap 对象的不正确处理(内存溢出);不要再主线程中处理图片。使用bitmap 对象时候使用recycle 释放。

3、线程由于匿名内部类runnable持有activity的引用,从而关闭activity,线程未完成造成内存泄漏。把线程改成静态内部类,调用WeakReference来持有外部资源。

4、非静态匿名内部类Handler由于持有外部类Activity的引用所造成的内存泄漏。根据WeakReference对象,对handler使用弱引用,并且调用removeCallbacksAndMessages移除。

5、BraodcastReceiver、File、Cursor等资源的使用未及时关闭。在销毁activity时,应该及时销毁或者回收。

6、static关键字修饰的变量由于生命周期过长,容易造成内存泄漏。尽量少使用静态变量,一定要使用要及时进行制null处理。

7、单例模式 造成的内存泄漏,如context 的使用,单列中传入的是activity的context,在关闭activity时,activity的内存无法被回收,因为单列持有activity的引用

在context的使用上,应该传入application的context到单列模式中,这样就保证了单列的生命周期跟application的生命周期一样

单列模式应该尽量少持有生命周期不同的外部对象,一旦持有该对象的时候,必须在该对象的生命周期结束前制null

你可能感兴趣的:(2020-02-08 Android 内存溢出和内存泄漏)