强软弱虚引用.
强引用:
他是我们最常见的引用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传递.
当我们用threadlocal.set对象的时候.方法会调用当前线程的Thread.get