强引用、软引用、弱引用和虚引用(2)

Tips:因为本人目前从事的是Android方面的工作,所以在下面总结一些在Android研发中会使用到弱引用或者软引用的地方

1.解决Handler可能造成的内存泄露 -- 使用弱引用

当使用内部类(包括匿名类)来创建Handler的时候,Handler对象会隐式地持有一个外部类对象(通常是一个Activity)的引用,不然你怎么可能通过Handler来操作Activity中的View。而Handler通常会伴随着一个耗时的后台线程(例如从网络拉取图片)一起出现,这个后台线程在任务执行完毕(例如图片下载完毕)之后,通过消息机制通知Handler,然后Handler把图片更新到界面。

然而,如果用户在网络请求过程中关闭了Activity,正常情况下,Activity不再被使用,它就有可能在GC检查时被回收掉,但由于这时线程尚未执行完,而该线程持有Handler的引用(不然它怎么发消息给Handler?),这个Handler又持有Activity的引用,就导致该Activity无法被回收(即内存泄露),直到网络请求结束(例如图片下载完毕)。

2.解决图片加载时,可能造成的内存不足问题 -- 使用软引用

使用软引用相对使用强引用,在图片加载方面能够很明显的提升性能,并减少崩溃的几率,与Lru算法指定LruCache能够更好的去管理,因为增加了根据图片使用频率来管理内存的算法,相比较更加合理和人性化。

补充:Java垃圾回收机制:

Java的垃圾回收器要负责完成3件任务:分配内存、确保被引用的对象的内存不被错误回收以及回收不再被引用的对象的内存空间。
垃圾回收是一个复杂而且耗时的操作。如果JVM花费过多的时间在垃圾回收上,则势必会影响应用的运行性能。一般情况下,当垃圾回收器在进行回收操作的时候,整个应用的执行是被暂时中止(stop-the-world)的。对于与用户交互的应用来说,则可能希望所垃圾回收所带来的应用停顿的时间间隔越小越好。对于这种情况,JVM中提供了多种垃圾回收方法以及对应的性能调优参数,应用可以根据需要来进行定制。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/61f1f5400d10fad90c4bb9b54dd4fdcf.html