首页 > 其他分享 >虚引用

虚引用

时间:2024-12-26 10:30:28浏览次数:2  
标签:回收 ThreadLocal 引用 new Entry 内存

当被应用的强引用失去后,强引用关联的这个引用也就是虚引用相关的分配就会被回收

  

以ThreadLocal<T>为例

1.进行塞值
public void set(T value) {             
    Thread t = Thread.currentThread(); 
    ThreadLocalMap map = getMap(t);    
    if (map != null) {                 
        map.set(this, value);          
    } else {                           
        createMap(t, value);           
    }                                  
}          
2.一开始塞值肯定不存在就得走这个方法
void createMap(Thread t, T firstValue) {                           
    t.threadLocals = new ThreadLocalMap(this, firstValue);         
}          

3.里面这个firstKey就是Thread
 ThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue) {            
     table = new Entry[INITIAL_CAPACITY];                                
     int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);      
     table[i] = new Entry(firstKey, firstValue);                         
     size = 1;                                                           
     setThreshold(INITIAL_CAPACITY);             
4.构建个Entry
 table[i] = new Entry(firstKey, firstValue);      
5.Entry里面长这样,构造参数里面有个super(k)
 static class Entry extends WeakReference<ThreadLocal<?>> {                  
     /** The value associated with this ThreadLocal. */                      
     Object value;                                                           
                                                                             
     Entry(ThreadLocal<?> k, Object v) {                                     
         super(k);                                                           
         value = v;                                                          
     }                                                                       
 }        

                                                                                                                                                                            

  

 继续看顶层引用

 默认这个queue是空,先不管它

 一直到最底层

 回头再来说,ThreadLocal的缺点,缺点有个啥来着,叫内存泄露,

 ThreadLocal<String> threadLocal = new ThreadLocal<>();//直接new一个出来,这个是强引用

        threadLocal.set("111");//塞值之后,把Thread和值放到里面的map里面去
一般情况下,threadLocal 消失后,塞值因为弱引用会被垃圾回收器回收。大并发情况下来不及回收,里面的map里面key引用的值来不及释放,没有及时被垃圾回收器回收,就造成了内存泄漏。

  于是之前讲的InheritableThreadLocal就发挥作用了。

但是据我观察,jdk17之后

虽然弱引用机制没有改变,但是 JDK 17 中内存管理方面的改进间接增强了对ThreadLocal相关内存的控制。
例如,JDK 17 的垃圾回收器(如 ZGC 和 Shenandoah GC)的优化使得内存回收更加高效和及时。 在高并发场景下,这些优化后的垃圾回收器能够更频繁地检查内存中的弱引用对象。
当ThreadLocal对象作为弱引用被回收后,
内存管理系统可以更快地识别并处理对应的ThreadLocalMap中的Entry,减少了无效Entry(键已被回收但值还在)在内存中停留的时间

  

标签:回收,ThreadLocal,引用,new,Entry,内存
From: https://www.cnblogs.com/wangbiaohistory/p/18632183

相关文章

  • 软引用
    定义软引用(SoftReference)是Java中引用类型的一种。它是一种相对较弱的引用,在Java的垃圾回收机制(GarbageCollection,GC)中具有特殊的处理方式。用途软引用主要用于缓存场景,当内存空间足够时,垃圾回收器不会回收软引用所指向的对象;只有当内存不足时,才会回收这些对象,以释放内......
  • 强引用
    //每一次创建一个对象都是强引用()也就是普通的引用Objectobject=newObject();publicclassTTT{//实际情况不需要重写,也不必要重写,java有垃圾回收器帮助回收C,C++需要回收。@Overrideprotectedvoidfinalize()throwsThrowa......
  • Java中的五种引用方式底层详解
        在GC算法的可达性算法中描述的对象引用,一般指的是强引用,即是GCRoot对象对普通对象有引用关系,只要这层关系存在,普通对象就不会被回收,而在Java中一共有五种引用关系。目录 强引用 (Strong Reference)软引用 (SoftReference)使用软引用实现简单缓存 一个实......
  • uniapp中组件的引用、组件之间数据的传递
    一、组件的引用1.首先有一个写好的组件cli-header.vue 目录为/pages/client/client-components/cli-header.vue2.在需要调用的页面编写代码<template><cliHeader/></template><script>importcliHeaderfrom'@/pages/client/client-components/cli-header.vu......
  • 11. Java的四种引用,强弱软虚
    强引用强引用是平常中使用最多的引用,强引用在程序内存不足(OOM)的时候也不会被回收,使用方式:Stringstr=newString("str");软引用软引用在程序内存不足时,会被回收,使用方式:点击查看代码//注意:wrf这个引用也是强引用,它是指向SoftReference这个对象的,//这里的软引用指的......
  • wps添加引用和参考文献的方法
    文章目录1.找到目标参考文献先复制再文档内部2.引用文献具体操作2.1.找到你要引用的位置(如下图)2.2点击引用--插入尾注2.3.复制1中的目标文献到此处2.4选中序号调整大小3.验证可行性1.找到目标参考文献先复制再文档内部前面的需要可以不需要2.引用文献具体操作2......
  • 若引用JS文件,或者CSS文件,应直接写入HTML文件
    <scriptsrc="https://cdn.bootcdn.net/ajax/libs/quill/2.0.2/quill.js"></script><linkhref="https://cdn.bootcdn.net/ajax/libs/quill/2.0.2/quill.snow.css"rel="stylesheet"><script>/*!Forlicense......
  • 论文引用 | 如何将正文引用批量设置上标?
    本方法适用对象:请注意,本方法针对下图所示论文引用格式:①外部:半角中括号②内部:数字,数字与半角逗号的组合,数字与连接符号的组合,数字、半角逗号与连接符号的组合主要步骤:1.打开高级查找2.在查找内容中输入\[[0-9,-]{1,}\],并勾选搜索选项中的“使用通配符”3.......
  • 引用 | 如何将正文引用批量设置上标?
    本方法适用对象:请注意,本方法针对下图所示论文引用格式:①外部:半角中括号②内部:数字,数字与半角逗号的组合,数字与连接符号的组合,数字、半角逗号与连接符号的组合主要步骤:1.打开高级查找2.在查找内容中输入\[[0-9,-]{1,}\],并勾选搜索选项中的“使用通配符”3.点击在以下......
  • Dubbo 3.x源码(27)—Dubbo服务引用源码(10)subscribeURLs订阅应用级服务url
    基于Dubbo3.1,详细介绍了Dubbo服务的发布与引用的源码。上文我们学习了Dubbo3的应用级服务发现订阅refreshServiceDiscoveryInvoker方法的源码,下面我们将会学习应用级服务发现订阅后半部分的源码,即在获取到服务应用名之后,通过subscribeURLs方法进行应用级别的服务url订阅......