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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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 @   bg_不够  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示