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)
    }
}

  

posted @ 2022-05-11 13:06  bg_不够  阅读(40)  评论(0)    收藏  举报