JVM学习日志(八) 强引用,软引用,弱引用,虚引用

简介: 强引用,软引用,弱引用,虚引用 简述

强引用,软引用,弱引用,虚引用

  • java有不同的引用类型,分别是:强引用,软引用,弱引用,虚引用,不同的引用类型跟我们的垃圾回收也有着不同的规则
  • image-20230424104129175.png

强引用

我们直接通过new 关键字创建出来的对象都叫做强引用对象例如:

Object obj = new Object();

强引用的特点

  1. 强引用可以直接访问目标对象
  2. 强引用所指向的对象在任何时候都不会被系统回收,JVM宁愿抛出OOM异常,也不会回收强引用所指向的对象
  3. 强引用可能导致内存泄漏

软引用

软引用是除了强引用外,最强的引用类型,可以通过java.lang.ref.SoftReference使用软引用,一个持有软引用的对象,不会被jvm很快回收,jvm会根据当前堆的使用情况来判断何时回收(只有当JVM认为内存不足时,才会试图去回收软引用的对象,JVM会确保抛出OutOfMemoryError之前,清理软引用指向的对象),因此,软引用可以用于实现对内存敏感的高速缓存

User user = new User();
SoftReference<User> sofitReference = new SoftReference<>(user);//创建一个软引用对象指向上面的强引用对象
User = null;//销毁强引用
System.gc();//手动垃圾回收
System.out.println(softReference.get());//打印软引用中User对象地址值

注意: 触发软引用回收的点在于内存空间已经装不下的时候,以及内存空间很紧张的时候执行回收

上述代码流程分析

image-20230424112124327.png

注意:软引用理论上来说属于GC_Roots对象,但是,当JVM进行软引用对象的回收的时候,一样会将引用回收,所以GC_Root对象并不是不能被回收的

弱引用

弱引用的引用强度比软引用要更弱一些,无论内存是否足够,只要JVM开始进行垃圾回收,那些被弱引用关联的对象都会被回收,再JDK1.2之后,用Java.lang.ref.WeakReference来表示弱引用

User user = new User();
WeekReference wReference = new WeekReference(user);
user = null;
System.out.println(wReference);

同理,弱引用也是会在垃圾回收器回收对象时,将引用清除, 同时,这种引用其实也是GC_Roots

虚引用

虚引用是最弱的一种引用关系,如果一个对象仅持有虚引用,那么他就和没有任何引用一样,他随时可能会被回收,再jdk1.2之后,用PhantomReference类来表示,通过查看这个类的源码,我们可以发现他只有一个构造函数和一个get()方法,而且他的get()方法仅仅返回一个null,也就是说永远无法通过虚引用来获取对象,虚引用必须要和ReferenceQueue引用队列一起使用,虚引用在创建时必须传入一个引用队列作为参数,当垃圾收集器准备回收一个对象时,如果发现她还有虚引用,就会再回收对象后,将这个虚引用加入到引用队列,以通知引用 程序对象的回收情况

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
4月前
|
存储 Go
Go 浅析主流日志库:从设计层学习如何集成日志轮转与切割功能
本文将探讨几个热门的 go 日志库如 logrus、zap 和官网的 slog,我将分析这些库的的关键设计元素,探讨它们是如何支持日志轮转与切割功能的配置。
111 0
Go 浅析主流日志库:从设计层学习如何集成日志轮转与切割功能
|
3月前
|
Oracle Java 编译器
基本概念【入门、 发展简史、核心优势、各版本的含义、特性和优势、JVM、JRE 和 JDK 】(二)-全面详解(学习总结---从入门到深化)
基本概念【入门、 发展简史、核心优势、各版本的含义、特性和优势、JVM、JRE 和 JDK 】(二)-全面详解(学习总结---从入门到深化)
47 1
|
3天前
|
SQL 监控 关系型数据库
【MySQL学习】MySQL的慢查询日志和错误日志
【MySQL学习】MySQL的慢查询日志和错误日志
|
9天前
|
监控 Docker 容器
Docker从入门到精通:Docker log 命令学习
了解 Docker 日志管理对容器监控至关重要。`docker logs` 命令用于查看和管理容器日志,例如,`docker logs &lt;container_name&gt;` 显示容器日志,`-f` 或 `--follow` 实时跟踪日志,`--tail` 显示指定行数,`--timestamps` 添加时间戳,`--since` 按日期筛选。Docker 支持多种日志驱动,如 `syslog`,可通过 `--log-driver` 配置。有效管理日志能提升应用程序的稳定性和可维护性。
13 0
|
2月前
|
Java
【JVM】深入理解Java引用类型:强引用、软引用、弱引用和虚引用
【JVM】深入理解Java引用类型:强引用、软引用、弱引用和虚引用
122 0
|
3月前
|
SQL 关系型数据库 MySQL
MySQL技能完整学习列表11、日志和备份——1、查看日志——2、数据备份和恢复(mysqldump, mysqlbinlog)
MySQL技能完整学习列表11、日志和备份——1、查看日志——2、数据备份和恢复(mysqldump, mysqlbinlog)
49 0
|
3月前
|
算法 Java
深入理解JVM - 解读GC日志
深入理解JVM - 解读GC日志
52 0
|
4月前
|
Oracle IDE Java
基本概念【入门、 发展简史、核心优势、各版本的含义、特性和优势、JVM、JRE 和 JDK 】(二)-全面详解(学习总结---从入门到深化)(下)
基本概念【入门、 发展简史、核心优势、各版本的含义、特性和优势、JVM、JRE 和 JDK 】(二)-全面详解(学习总结---从入门到深化)
37 1
|
4月前
|
Java 程序员 PHP
基本概念【入门、 发展简史、核心优势、各版本的含义、特性和优势、JVM、JRE 和 JDK 】(二)-全面详解(学习总结---从入门到深化)(上)
基本概念【入门、 发展简史、核心优势、各版本的含义、特性和优势、JVM、JRE 和 JDK 】(二)-全面详解(学习总结---从入门到深化)
32 0
|
2天前
|
XML Java Maven
Springboot整合与使用log4j2日志框架【详解版】
该文介绍了如何在Spring Boot中切换默认的LogBack日志系统至Log4j2。首先,需要在Maven依赖中排除`spring-boot-starter-logging`并引入`spring-boot-starter-log4j2`。其次,创建`log4j2-spring.xml`配置文件放在`src/main/resources`下,配置包括控制台和文件的日志输出、日志格式和文件切分策略。此外,可通过在不同环境的`application.yml`中指定不同的log4j2配置文件。最后,文章提到通过示例代码解释了日志格式中的各种占位符含义。