强软弱虚引用.

强软弱虚引用.

强引用:

他是我们最常见的引用object o=new Object();这个就是强引用.当我们修改他为null时他才可能被回收.o=null;因为他不存在指向了.

软引用:

垃圾回收器,内存不够的时候回收.
在这里插入图片描述使用软引用需要导包.软引用我们需要在泛型中填入我们需要引用的对象.
为什么要使用软引用:
因为他特别适合当缓存.当超出堆内存的时候,他就会被gc回收.

弱引用:

垃圾回收器看到就会回收
弱引用是为了解决某些地方内存泄露的问题.主要是应用在ThreadLocal里.
在这里插入图片描述

虚引用PhantomReference:

垃圾回收器看到就回收.虚引用主要用来跟踪对象被垃圾回收的活动。管理直接内存.jvm中堆外内存叫做直接内存.直接内存不归gc管理,她是被hospot管理C++.
当网卡传输一个数据的时候他经过计算机内核处理到缓存区中.jvm要想得到这个操作这个数据只能通过从缓存区中复制到jvm堆内存中.但是数据太多效率就太低了.所以jvm提供了堆引用指向堆外的内存.这个叫做zero copy.

当堆内存的M对象被gc后.他会被放在ReferenceQueue中,这个queue就相当于传递消息的作用.虚引用相当于提供一个钩子.告知hospot回收堆外内存.
在这里插入图片描述堆外内存也可能发生oom.比如在老年代有很多对象指向堆外内存的,如果过多.可能会撑爆堆外内存.

虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用。

ThreadLocal线程独享的.

他最典型的应用场景是SPring 中的Transaction事务的支持.
比如我们调用方法M().只需要在上面添加事务注解就可以了,当M调用m1,m2,m3方法时.这时候必须保证他们是使用的同一个数据库连接.如果不是那么将构成不了事务.使用ThreadLocal传递对象connection

那么他是如何实现这一功能的呢.

打开源码set 你会发现他是通过当前线程key 得到一个ThreadLocalMap对象,这个map对象是每个线程独有的.
set方法他将this 也就是ThreadLocal自己作为key 我们传的值作为value实现的.

那我们打开源码在深入研究set方法是如何set进去的,我们发现他是new 了一个entry对象,该对象继承了weekReference对象,那么也就说明他是个弱引用继承类,并且在entry构造方法中 调用了 super(key),那么也就是说这个key 弱引用了 ThreadLocal.

当我们用threadlocal.set对象的时候.方法会调用当前线程的Thread.Threadlocals

用threadlocal一定要记得remove.否则会造成内存泄漏.在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43203363/article/details/109163903
今日推荐