java基础-引用
分类:强引用(Strong Reference)、软引用(Soft Reference)、若引用(Weak Reference)、虚引用(Phantom Reference)
强引用
java默认引用方式,只要引用链存在,系统哪怕OOM都不会回收
软引用 SoftReference<T>
SoftReference<T> 内存不足时 gc运行就会回收
弱引用 WeakReference<T>
WeakReference<T> 只要gc运行就会被回收
虚引用
虚引用 需要配合ReferenceQueue使用 get的是null 需要ReferenceQueue.pull()
class ReferenceDemo {
@Test
fun ReferenceTest() {
//强引用
val user = UserInfo()//这个就是强引用 只要引用链存在就不会被回收
val softUser by Soft { UserInfo(name = "softUser", age = 1) }//软引用 内存不足才gc回收
val weakUser by Weak { UserInfo(name = "weakUser", age = 2) } //若引用 只要gc回收就会被回收
println("before gc")
println("user is ${user}")
println("softUser is ${softUser}")
println("weakUser is ${weakUser}")
System.gc()
println("after gc")
println("user is ${user}")
println("softUser is ${softUser}")
println("weakUser is ${weakUser}")
val list = LinkedList<Byte>()
try {
(0..100).forEach { _ ->
list.add((1024 * 1024 * 10).toByte())
}
} catch (e: Throwable) {
e.printStackTrace()
}finally {
println("after big size")
println("user is ${user}")
println("softUser is ${softUser}")
println("weakUser is ${weakUser}")
}
// 输出结果
// before gc
// user is com.tab.composedemo.UserInfo@c03cf28
// softUser is com.tab.composedemo.UserInfo@1329eff
// weakUser is com.tab.composedemo.UserInfo@6497b078
// after gc
// user is com.tab.composedemo.UserInfo@c03cf28
// softUser is com.tab.composedemo.UserInfo@1329eff
// weakUser is null
}
}
class UserInfo(var name: String = "", var age: Int = 1)
class Weak<T>(initializer: () -> T?) {
private var reference: WeakReference<T?> = WeakReference(initializer())
constructor() : this({ null })
operator fun getValue(thisRef: Any?, property: KProperty<*>): T? = reference.get()
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T?) {
this.reference = WeakReference(value)
}
}
class Soft<T>(initializer: () -> T?) {
private var reference: SoftReference<T?> = SoftReference(initializer())
constructor() : this({ null })
operator fun getValue(thisRef: Any?, property: KProperty<*>): T? = reference.get()
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T?) {
this.reference = SoftReference(value)
}
}

浙公网安备 33010602011771号