其作用是存储线程本地变量,独享资源,避免和主内存通信,从而提高效率。 原理:都是操作线程中的ThreadLocalMap对象。 set(obj): 获取当前线程中的ThreadLocalMap,以ThreadLocal实例为key,obj为value,并且key是弱引用。也就是说ThreadLocal实例(未被其他变量强引用)被垃圾回收器扫描到就会被回收,从而导致key = null。
其实有个非常关键的注意点,利用软引用和弱引用,我们可以将访问到的对象,重新指向强引用,也就是人为的改变了对象的可达性状态。所以对于软引用、弱引用之类,垃圾收集器可能会存在二次确认的问题,以确保处于弱引用状态的对象没有改变为强引用。 但是有个问题,如果我们错误的保持了强引用(比如,赋值给了static变量),那...
// 阶段1:只处理软引用,因为policy入参,只有软引用不为NULL // 功能:把不存活的软引用从refs_lists中移除 if (policy != NULL) { if (mt_processing) { RefProcPhase1Task phase1(*this, refs_lists, policy, true /*marks_oops_alive*/); task_executor->execute(phase1); } else { for (uint ...
强引用, StrongRefrence , Java 默认的引用 , 如果被 强引用 引用的对象 ,永远都不可能被回收, 即使出现了 OOM ; 内存泄漏也是强引用导致的 ; 软引用, SoftRefrence , 当 系统内存不足时 , 软引用即使还引用着对象 , 也要将该对象回收 ;将要出现 OOM 时 , 会回收软引用 ; 弱引用, WeakRefrence , 不管...
虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。 ReferenceQueue queue = new ReferenceQueue (); ...
jvm原理---深入解析强引用、软引用、弱引用、幻象引用(虚引用) 关于强引用、软引用、弱引用、幻象引用的区别,在很多公司的面试题中经常出现,可能有些小伙伴觉得这个知识点比较冷门,其实大家在开发中经常用到,如new一个对象的时候就是强引用的应用。 在