整理自:马士兵老师详解:Java的四种引用类型(对象的强、软、弱和虚引用)_哔哩哔哩_bilibili
1. Java有哪些引用类型
强软弱虚
2. 什么是强引用?
如上:M类重写了一个finalize 方法。正常不建议重写,重写的目的是为了跟踪M产生的对象被gc垃圾回收的过程。
finalize在对象被回收的时候,会被调用到,所以:当看到打印finalize,就知道 对象被回收
3. 软引用
当空间不够了,软引用的对象会被回收
可以通过-Xmx20M设置
1. 问题来了?软引用有什么用?
软引用比较适合做缓存
2. SR指向的对象被回收吗?是的
![]()
4. 弱引用
如果只有弱引用指向,没有强引用,那么在gc的时候,是会被回收掉的【gc看到,直接回收】
5. 虚引用
虚引用:虚到什么程度呢?get都get不到。会返回一个null
![]()
那作用是什么呢?
管理直接内存 Direct Memory。。。(也就是堆外内存),不归GC管理,可以归HotSpot (JVM管理)
这一块内存通常用于NIO,也就是非阻塞IO
如:JVM从网卡读取数据,经过操作系统的 内核放到缓冲区,JVM将数据复制到自己的内存里,方便管理 。
那当网络数据越来越多的时候,这个时候效率就很低了,所以:就有了一个功能,可以通过堆里面的引用指向堆外内存,直接就可以拿来使用,用不着copy,也就是Zero Copy
如下场景下:堆外内存如何被回收?JVM需要关注这个点,那为了解决这个点:
所以虚引用就是起到这样的作用。。。
1. 首先get不到
IO缓冲区 :allocateDirect在堆外分配
![]()