什么是OOM,如何避免
OOM:Out Of Memory,内存泄漏
可以从四个方面来避免OOM:首先是减小对象的内存占用,其次是内存对象的重复利用,然后是避免对象的内存泄露,最后是内存使用策略优化。
1) 使用更加轻量的数据结构 例如,我们可以考虑使用ArrayMap/SparseArray而不是HashMap等传统数据结构
2) 避免在Android里面使用Enum(枚举)
3) 减小Bitmap对象的内存占用 Bitmap是一个极容易消耗内存的类型,注意临时Bitmap对象的及时回收。
4) 使用更小的图片。在设计给到资源图片的时候,我们需要特别留意这张图片是否存在可以压缩的空间,是否可以使用一张更小的图片。尽量使用更小的图片不仅仅可以减少内存的使用,还可以避免出现大量的InflationException。假设有一张很大的图片被XML文件直接引用,很有可能在初始化视图的时候就会因为内存不足而发生InflationException,这个问题的根本原因其实是发生了OOM
5) 注意在ListView/GridView等出现大量重复子组件的视图里面对ConvertView的复用
6) 避免在onDraw方法里面执行对象的创建。类似onDraw等频繁调用的方法,一定需要注意避免在这里做创建对象的操作,因为他会迅速增加内存的使用,而且很容易引起频繁的gc,甚至是内存抖动。
7) 注意WebView的泄漏
8) 谨慎使用static对象。因为static的生命周期过长,和应用的进程保持一致,使用不当很可能导致对象泄漏,在Android中应该谨慎使用static对象。
9) 特别留意单例对象中不合理的持有。虽然单例模式简单实用,提供了很多便利性,但是因为单例的生命周期和应用保持一致,使用不合理很容易出现持有对象的泄漏。
10) 优化布局层次,减少内存消耗。越扁平化的视图布局,占用的内存就越少,效率越高。我们需要尽量保证布局足够扁平化,当使用系统提供的View无法实现足够扁平的时候考虑使用自定义View来达到目的。
OOM:Out Of Memory,内存泄漏
可以从四个方面来避免OOM:首先是减小对象的内存占用,其次是内存对象的重复利用,然后是避免对象的内存泄露,最后是内存使用策略优化。
1) 使用更加轻量的数据结构 例如,我们可以考虑使用ArrayMap/SparseArray而不是HashMap等传统数据结构
2) 避免在Android里面使用Enum(枚举)
3) 减小Bitmap对象的内存占用 Bitmap是一个极容易消耗内存的类型,注意临时Bitmap对象的及时回收。
4) 使用更小的图片。在设计给到资源图片的时候,我们需要特别留意这张图片是否存在可以压缩的空间,是否可以使用一张更小的图片。尽量使用更小的图片不仅仅可以减少内存的使用,还可以避免出现大量的InflationException。假设有一张很大的图片被XML文件直接引用,很有可能在初始化视图的时候就会因为内存不足而发生InflationException,这个问题的根本原因其实是发生了OOM
5) 注意在ListView/GridView等出现大量重复子组件的视图里面对ConvertView的复用
6) 避免在onDraw方法里面执行对象的创建。类似onDraw等频繁调用的方法,一定需要注意避免在这里做创建对象的操作,因为他会迅速增加内存的使用,而且很容易引起频繁的gc,甚至是内存抖动。
7) 注意WebView的泄漏
8) 谨慎使用static对象。因为static的生命周期过长,和应用的进程保持一致,使用不当很可能导致对象泄漏,在Android中应该谨慎使用static对象。
9) 特别留意单例对象中不合理的持有。虽然单例模式简单实用,提供了很多便利性,但是因为单例的生命周期和应用保持一致,使用不合理很容易出现持有对象的泄漏。
10) 优化布局层次,减少内存消耗。越扁平化的视图布局,占用的内存就越少,效率越高。我们需要尽量保证布局足够扁平化,当使用系统提供的View无法实现足够扁平的时候考虑使用自定义View来达到目的。