JDK1.2版本开始把对象的引用分为四种级别,使程序能更加灵活的控制对象的生命周期。这四种引用级别由高到低依次为:强引用、软引用、弱引用和虚引用。
- 软引用:Soft
Reference,仅当JVM内存不足(即将抛出OutOfMemoryError前)时,垃圾回收器才会回收软引用对象。 - 弱引用:
WeakReference,无论内存是否充足,只要发生垃圾回收且对象仅被弱引用指向,该对象就会被立即回收。
软引用可以加速JVM对垃圾内存的回收速度,可以维护系统的运行安全,防止内存溢出(OutOfMemory)等问题的产生。
如果只是想避免OutOfMemory异常发生,则可以使用软引用。若对应用的性能更在意,尽快回收一些占用内存比较大的对象,则可以使用弱引用。和弱引用功能类似的是WeakHashMap。
弱引用场景:Handler类实例内弱引用宿主实例,防止内存泄漏。
软引用场景:应用中有图片资源会多次用到,如果每次都去获取,读取文件需要硬件操作,速度慢,导致性能降低。考虑将图片缓存起来,需要时直接从内存中获取,但是图片占用内存空间很大,容易OutOfMemory,这时考虑软引用。
Java对象之间的引用使用规则
- 生命周期短的对象,不要被生命周期长的对象强引用。
- 对象外部的更长生命周期的对象引用它时要使用弱引用。
- 对象内部的成员对象都是相同或短生命周期,可以强引用本对象。
- 非静态内部类不属于成员,同时它会自动隐式强引用外部对象,当它的生命周期比外部对象长时会造成外部对象无法及时释放,所以要保证它的生命先于外部对象的生命结束。
- 静态内部类也不属于成员,但它不会自动强引用外部对象,当它的生命周期比外部对象更长时不会造成外部对象无法及时释放。但若要在静态内部类中使用外部对象时,要声明为弱引用。
对多个同类对象的弱引用方式
如果想把多个同类对象以数组的方式进行弱引用,有两种方式:
- 用一个弱引用持有一个对象数组。这个对象数组不能是临时数组,必须有生命周期长的对象对此数组有强引用,否则它会很快消失。
- 用一个数组来包含多个弱引用。
使用静态内部类的必要性
因为匿名类是特殊的内部类——写法更为简洁。当需要一次性特殊的子类时,Java 提供的语法糖能让表达式最少化。这种很赞很偷懒的写法却容易导致泄漏。正如使用内部类一样,只要不跨越生命周期,内部类是没问题的。但是AsyncTask等有些类是用于产生后台线程的,这些 Java 线程是全局的,而且持有创建者的引用(即匿名类的引用),而匿名类又持有外部类的引用。线程是可能长时间运行的,所以一直持有 Activity 的引用,导致当销毁时无法回收。 这样不能通过移除静态成员变量解决,因为线程是于应用生命周期相关的。 为了避免泄漏,必须舍弃简洁偷懒的写法,把子类声明为静态内部类。
静态内部类不持有外部类的引用,打破了链式引用。
如果坚持使用匿名类,只要在生命周期结束时中断线程就可以。
本文详细介绍了一种在Photoshop中将TGA文件转换为带有透明通道的PNG文件的方法。通过一系列步骤,如打开TGA文件、创建背景图层、加载Alpha通道作为选择并应用图层蒙版等操作,实现透明效果的转移。

1808

被折叠的 条评论
为什么被折叠?



