弱引用和强引用。

强引用

我先说一下强引用,比如 User user = new User("沉默王二") 中,user 就是一个强引用,new User("沉默王二") 就是强引用对象。

当 user 被置为 null 时(user = null),new User("沉默王二") 对象就会被垃圾回收;否则即便是内存空间不足,JVM 也不会回收 new User("沉默王二") 这个强引用对象,宁愿抛出 OutOfMemoryError。

弱引用

弱引用,比如说在使用 ThreadLocal 中,Entry 的 key 就是一个弱引用对象。

ThreadLocal<User> userThreadLocal = new ThreadLocal<>();
userThreadLocal.set(new User("沉默王二"));

userThreadLocal 是一个强引用,new ThreadLocal<>() 是一个强引用对象;

new User("沉默王二") 是一个强引用对象。

调用 set 方法后,会将 key = new ThreadLocal<>() 放入 ThreadLocalMap 中,此时的 key 是一个弱引用对象。当 JVM 进行垃圾回收时,如果发现了弱引用对象,就会将其回收。

其关系链就是:

  1. ThreadLocal 强引用 -> ThreadLocal 对象。
  2. Thread 强引用 -> ThreadLocalMap。
  3. ThreadLocalMap[i] 强引用了 -> Entry。
  4. Entry.key 弱引用 -> ThreadLocal 对象。
  5. Entry.value 强引用 -> 线程的局部变量对象。
posted @ 2025-04-23 12:22  kuki'  阅读(17)  评论(0)    收藏  举报