java中的4种引用和GC Roots
https://juejin.im/post/5d06de9d51882559ee6f4212?utm_source=gold_browser_extension
1.首先,四种引用如下:
- FinalReference 强引用
- SoftReference 软引用
- WeakReference 弱引用
- PhantomReference 虚引用
2.四种引用的特点:
强引用:被new出来的对象都是的引用都是强引用
eg:Student s = new Student();
回收时机:不会被回收,会发生内存溢出。
软引用:软引用关联的对象,在内存不够的情况下,会把这些软引用关联的对象列入垃圾回收范围中,然后进行回收,也就是说软引用并非是完全安全的,在内存不够的情况下是会被垃圾回收器回收掉的。
public static void main(String[] args) {
SoftReference[] references = new SoftReference[5];
ReferenceQueue<ReferenceTestObject> referenceTestObjectReferenceQueue = new ReferenceQueue<>();
for(int i =0 ;i<5;i++){
references[i] = new SoftReference(new ReferenceTestObject("ahahh-"+i),referenceTestObjectReferenceQueue);
}
for(int i =0 ;i<5;i++){
Object o = references[i].get();
if(o == null){
System.out.println("null");
}else{
System.out.println(((ReferenceTestObject)o).name);
}
}
}
使用场景:使用软引用来保存从数据库中取出的数据,具体是做了一个中间层的封装,该中间层的作用就是在get出数据的时候会去判断数据是否为null,如果是为null再次从数据库读取,读取后再放入软引用的集合中,这样的做法是可以避免内存溢出。
弱引用:只要发生GC都会被回收掉
eg:ThreadLocalMap的key
static class ThreadLocalMap {
/**
* The entries in this hash map extend WeakReference, using
* its main ref field as the key (which is always a
* ThreadLocal object). Note that null keys (i.e. entry.get()
* == null) mean that the key is no longer referenced, so the
* entry can be expunged from table. Such entries are referred to
* as "stale entries" in the code that follows.
*/
static class Entry extends WeakReference<ThreadLocal<?>> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}
......}
虚引用
有和没有一个样:无法通过虚引用来获取对象的实例,但是还是有作用的。、
作用就是能在这个对象被收集器回收时收到一个系统通知,实现追踪垃圾收集器的回收动作,比如在对象被回收的时候,会调用该对象的finalize方法。
ReferenceQueue 引用队列:
在创建Reference时,手动将Queue注册到Reference中,而当该Reference所引用的对象被垃圾收集器回收时,JVM会将该Reference放到该队列中,而我们便可以对该队列做些其他业务,相当于一种通知机制。
可达性分析:

对象4、5、6都是可被回收的。 那么问题来了,哪些对象可以作为GC Roots呢? 这里给出几个,如下
虚拟机栈中引用的对象
方法区中类静态属性引用的对象
方法区中常量引用的对象
本地方法栈JNI引用的对象
java中的4种引用和GC Roots的更多相关文章
- JAVA中的四种引用以及ReferenceQueue和WeakHashMap的使用示例
简介: 本文主要介绍JAVA中的四种引用: StrongReference(强引用).SoftReferenc(软引用).WeakReferenc(弱引用).PhantomReference(虚引用) ...
- Java中的四种引用
引用定义 实际上,Java中存在四种引用,它们由强到弱依次是:强引用.软引用.弱引用.虚引用.下面我们简单介绍下这四种引用: 强引用(Strong Reference):通常我们通过new来创建一个新 ...
- Java 中的四种引用及垃圾回收策略
Java 中有四种引用:强引用.软引用.弱引用.虚引用: 其主要区别在于垃圾回收时是否进行回收: 1.强引用 使用最普遍的引用.如果一个对象具有强引用,那就 类似于必不可少的生活用品,垃圾回收器绝不会 ...
- Java 中的四种引用
1.强引用(Strong Reference)在 Java 中四种引用中是“最强”的,我们平时通过 new 关键字创建的对象都属于强引用,如下面的代码: Person person = new Per ...
- Java中的四种引用方式
无论是通过引用计数算法判断对象的引用数量,还是通过可达性分析算法判断对象的引用链是否可达,判定对象是否存活都与"引用"有关.在Java语言中,将引用又分为强引用.软引用.弱引用 ...
- Java入门系列 Java 中的四种引用
Why java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指向该对象. java对象的引用包括强引用,软引用,弱引用,虚引用 Java中提供这四种引用类型 ...
- java中的四种引用方式(强引用,软引用,弱引用,虚引用)
java内存管理主要有内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指向该对象. java中对象的引用主要有四种:强引用,软引用,弱引用,虚引用. Java中提供这四种引 ...
- Java中的四种引用(强引用、软引用、弱引用、虚引用)
以下内容摘自<深入理解Java虚拟机 JVM高级特性与最佳实践>第2版,强烈推荐没有看过的同学阅读,读完的感觉就是"原来学的都是些什么瘠薄东西(╯‵□′)╯︵┴─┴" ...
- Java中的四种引用和引用队列
目录 强引用 软引用 弱引用 幻象引用 Reachability Fence 参考 强引用 正常的引用,生命周期最长,例如 Object obj = new Object(); 当JVM内存不足时,宁 ...
- java 中的三种引用,强引用,软引用,弱引用
StrongReference 前引用,不会被系统GC回收,系统宁愿跑出OOM异常也不会回收强引用 SoftReference 软引用,在系统内存不足的时候,会被GC回收 WeakReferen ...
随机推荐
- node_modules/canvas npm ERR! command failed
Installing packages. This might take a couple of minutes.Installing react, react-dom, and react-scri ...
- 权昌TSC条码打印机终极使用教程与开发版本代码大全
本教程使用的打印机型号:TSC TTP-244 Plus 官方文档 一.TSC打印机安装 1.机器安装 根据官方快速安装指南安装打印机,此处不详细说明,也可以看视频教程,唯一需要注意的地方就是碳带的方 ...
- C# 使用多线程的几种方式
1.Thread 详细介绍:https://www.cnblogs.com/cheng8/p/16147918.html 使用Thread类通过ThreadStart(无参数)或Parameteriz ...
- 整合log4j
引入依赖 <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId& ...
- kubernetes中 pause的作用
pause的作用 重要概念:Pod内的容器都是平等的关系,共享Network Namespace.共享文件 pause容器的最主要的作用:创建共享的网络名称空间,以便于其它容器以平等的关系加入此网络名 ...
- 循环3-while语法
一.介绍和语法 1. while循环方式 while循环语句会对紧跟在while命令后的条件表达式进行判断,如果该表达式成立,则执行while循环里面的命令或语句,每一次执行到done时,会重新判断w ...
- Redis基础命令和持久化
Redis命令工具 Redis-server :用于启动Redis的工具 Redis-benchmark:用于检查Redis在本机的运行效率 Redis-check-aof:修复aof持久化文件 Re ...
- t:datagrid 行编辑 类型备份
如编辑文本类型: <t:dgCol extendParams="editor:'text'" /> 如编辑数值类型: <t:dgCol extendParams= ...
- Qt ui 文件转换为python代码文件
python -m PyQt5.uic.pyuic -o ui_xxx.py xxx.ui
- Linux 使用Squid部署代理缓存服务
代理缓存服务 Squid是Linux系统中最为流行的一款高性能代理服务软件,通常用作Web网站的前置缓存服务,能够代替用户向网站服务器请求页面数据并进行缓存.简单来说,Squid服务程序会按照收到的用 ...