1、强引用StrongReference
在默认情况下kotlin中的引用都是强引用且也没提供强引用的类。其强引用的对象不管内存空间是否足够都不会回收只有在取消强引用后才能回收,这就可能造成内存泄漏。
而且在此过程中若我们创建单例对象,在这中引用了MainActivity,在Mactivity销毁时,这个对象可能销毁不了,就会造成空指针异常。
2、弱引用WeakReference
(weakReference类)如果一个对象只具有弱引用,不管内存空间是否足够都会回收其内存,可以说弱引用的对象是缓存的。这可以防止内存泄露。
代码示例:
fun main() {
// 强引用
var strongRef: Any = Any()
// 弱引用
val weakRef = WeakReference(strongRef)
// 释放强引用
strongRef = Any()
// 使用弱引用获取对象
val obj = weakRef.get()
if (obj != null) {
println("弱引用正常获取对象:$obj")
} else {
println("对象已被释放")
}
}
3、软引用SoftReference
(softReference类)如果一个对象只具有弱引用,只要内存空间足够就不会回收,只有内存空间不足时才会回收。这里对象也是缓存的,它也是解决内存泄漏。
4、虚引用
随时可能被回收,和没引用一样,很少用到
5、对比
引用类型 | 被回收时间 | 用途 | 如何获取对象 | 生命周期 |
强引用 | never | 对象一样的存在 | 直接访问 | JVM运行停止时 |
软引用 | 内存不足时 | 对象缓存 | get() | 内存不足 |
弱引用 | 垃圾回收时 | 对象缓存 | get() | gc运行终止后 |