解决内存泄漏之道

    一个长期运行的应用程序,如果无用的对象不能得到及时的释放,久而久之,便形成了事实上的内存泄露,内存泄漏多了,便会导致内存溢出。这个是我们不愿意看到的。我们以前学过,如果及时地释放内存,最稳妥的方法就是使用完对象之后,立刻执行"object = null"语句,当然,这也是一种理想状态。JDK为我们引入了4种对象引用类型,有利于JVM进行垃圾回收Java对象的引用包括强引用,软引用,弱引用,虚引用。

    我们所讨论的内存泄露,主要讨论堆内存,他存放的就是引用指向的对象实体。有时候确实会有一种情况:当需要的时候可以访问,当不需要的时候可以被回收也可以被暂时保存以备重复使用。比如:ListView或者GridView、RecyclerView加载大量数据或者图片的时候,图片非常占用内存,一定要管理好内存,不然很容易内存溢出。滑出去的图片就回收,节省内存。看ListView的源码----回收对象,还会重用ConvertView。如果用户反复滑动或者下面还有同样的图片,就会造成多次重复IO(很耗时),那么需要缓存----平衡好内存大小和IO,算法和一些特殊的java类。

算法:lrucache(最近最少使用先回收)

特殊的java类:利于回收,StrongReference,SoftReference,WeakReference,PhatomReference
StrongReference,强引用:
回收时机:从不回收;使用:对象的一般保存;生命周期:JVM停止的时候才会终止
SoftReference,软引用:
回收时机:当内存不足的时候;使用:SoftReference<String>结合ReferenceQueue构造有效期短;生命周期:内存不足时终止
WeakReference,弱引用:
回收时机:在垃圾回收的时候;使用:同软引用;生命周期:GC后终止
PhatomReference,虚引用:
回收时机:在垃圾回收的时候;使用:合ReferenceQueue来跟踪对象呗垃圾回收期回收的活动;生命周期:GC后终止

开发时,为了防止内存溢出,处理一些比较占用内存大并且生命周期长的对象的时候,可以尽量使用软引用和弱引用。
软引用比LRU算法更加任性,回收量是比较大的,你无法控制回收哪些对象。

比如使用场景:默认头像、默认图标。
ListView或者GridView、RecyclerView要使用内存缓存+外部缓存(SD卡)

猜你喜欢

转载自blog.csdn.net/tiangongkaiwu152368/article/details/80330794