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) } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)