JVM——垃圾回收

news2024/10/7 18:20:16

垃圾回收

1、如何判断对象可以回收?

一、引用计数法

当一个对象被其他变量引用时,使其计数+1(若被引用两次,计数为2),若某个变量不在引用它时,使其计数-1;当这个对象引用计数变为0时意味着不再被引用,则可以作为垃圾进行回收

弊端:循环引用时,两个对象的计数都为1,导致两个对象都无法被释放
在这里插入图片描述
【早期Python虚拟机进行垃圾回收控制时采用引用计数算法,Java虚拟机则采用下面算法】

二、可达性分析算法

判断当前对象是否直接或间接的被根对象必定不能被当作垃圾回收的对象)所引用,如果没有,则进行垃圾回收
●JVM虚拟机中的垃圾回收器通过可达性分析来探索所有存活的对象
●扫描堆中的对象,看能否沿着GC Root对象为起点的引用链找到该对象,如果找不到,则表示可以回收
●哪些对象可以作为GC Root的对象

    虚拟机栈(栈帧中的本地变量表)中引用的对象。 
    方法区中类静态属性引用的对象
    方法区中常量引用的对象
    本地方法栈中JNI(即一般说的Native方法)引用的对象

五种引用(四大引用中有五种)
在这里插入图片描述
强引用
只有GC Root都不引用(没有GC Root直接/间接引用)该对象时,才会回收强引用对象

  ●如上图BC对象都不引用A1对象时,A1对象才会被回收

软引用
当GC Root指向软引用对象(没有被直接的强引用所引用)时,在内存不足时,会回收软引用所引用的对象

  ● 如上图如果B对象不再引用A2对象且内存不足时,软引用所引用的A2对象就会被回收

软引用的使用

public class Demo1 {
	public static void main(String[] args) {
		final int _4M = 4*1024*1024;
		//使用软引用对象 list和SoftReference是强引用,而SoftReference和byte数组则是软引用
		List<SoftReference<byte[]>> list = new ArrayList<>();
		SoftReference<byte[]> ref= new SoftReference<>(new byte[_4M]);
	}
}

如果在垃圾回收时发现内存不足,在回收软引用所指向的对象时,软引用本身不会被清理

如果想要清理软引用,需要使用引用队列

public class Demo1 {
	public static void main(String[] args) {
		final int _4M = 4*1024*1024;
		//使用引用队列,用于移除引用为空的软引用对象
		ReferenceQueue<byte[]> queue = new ReferenceQueue<>();
		//使用软引用对象 list和SoftReference是强引用,而SoftReference和byte数组则是软引用
		List<SoftReference<byte[]>> list = new ArrayList<>();
		SoftReference<byte[]> ref= new SoftReference<>(new byte[_4M]);

		//遍历引用队列,如果有元素,则移除
		Reference<? extends byte[]> poll = queue.poll();
		while(poll != null) {
			//引用队列不为空,则从集合中移除该元素
			list.remove(poll);
			//移动到引用队列中的下一个元素
			poll = queue.poll();
		}
	}
}

大概思路为:查看引用队列中有无软引用,如果有,则将该软引用从存放它的集合中移除(这里为一个list集合)

弱引用
只有弱引用(没有被直接的强引用所引用)引用该对象时,在垃圾回收时,无论内存是否充足,都会回收弱引用所引用的对象

  ● 如上图如果B对象不再引用A3对象,则A3对象会被回收

弱引用的使用和软引用类似,只是将 SoftReference 换为了 WeakReference

虚引用
当虚引用对象所引用的对象被回收以后,虚引用对象就会被放入引用队列中,调用虚引用的方法

  ● 虚引用的一个体现是释放直接内存所分配的内存,当引用的对象ByteBuffer被垃圾回收以后,
    虚引用对象Cleaner就会被放入引用队列中,然后调用Cleaner的clean方法来释放直接内存
  ● 如上图,B对象不再引用ByteBuffer对象,ByteBuffer就会被回收。但是直接内存中的内存还
    未被回收。这时需要将虚引用对象Cleaner放入引用队列中,然后调用它的clean方法来释放直接内存

终结器引用
所有的类都继承自Object类,Object类有一个finalize方法。当某个对象不再被其他的对象所引用时,会先将终结器引用对象放入引用队列中,然后根据终结器引用对象找到它所引用的对象,然后调用该对象的finalize方法。调用以后,该对象就可以被垃圾回收了

  ●  如上图,B对象不再引用A4对象。这是终结器对象就会被放入引用队列中,引用队列会根据它,
     找到它所引用的对象。然后调用被引用对象的finalize方法。调用以后,该对象就可以被垃圾回收了

引用队列
● 软引用和弱引用可以配合引用队列
弱引用虚引用所引用的对象被回收以后,会将这些引用放入引用队列中,方便一起回收这些软/弱引用对象

● 虚引用和终结器引用必须配合引用队列
虚引用和终结器引用在使用时会关联一个引用队列

小结
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/114472.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

吴恩达【神经网络和深度学习】Week1——深度学习概述

文章目录1、What is a neural network?2、Supervised Learning with Neural Networks2.1、Examples2.2、The classification of data3、Why is Deep Learning taking off&#xff1f;4、Quiz课程笔记整理按照所讲章节的标题来完成1、What is a neural network? 以房价预测模型…

基于HTML5 技术的开放自动化HMI

人机交互接口&#xff08;HMI&#xff09;是自动化系统中不可或缺的一部分。传统的做法是提供一个HMI 显示屏&#xff0c;并且通过组态软件来配置显示屏的功能&#xff0c;通过modbus 或者以太网与PLC 连接。 现在&#xff0c;事情变得复杂了许多&#xff0c;用户不仅需要通过专…

干货 | 关于PCB中的“平衡铜”,一文全部说明白

平衡铜是PCB设计的一个重要环节&#xff0c;对PCB上闲置的空间用铜箔进行填充&#xff0c;一般将其设置为地平面。 平衡铜的意义在于&#xff1a; 对信号来说&#xff0c;提供更好的返回路径&#xff0c;提高抗干扰能力&#xff1b;对电源来说&#xff0c;降低阻抗&#xff0c;…

Android 13 源码获取与构建

文章目录1. 环境准备1.1 基本信息1.2 系统初始化1.2.1 更新 Ubuntu 软件包1.2.2 安装 git 工具1.2.3 安装依赖包(Ubuntu 18.04)1.2.4 修改默认python版本1.2.5 安装 repo 工具2. 源码下载完成2.1 创建源码目录2.2 初始化源码仓库2.3 开始下载源码2.4 Android 13 源码目录3. 构建…

m可见光通信的空间调制(sm)误码率matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 可见光通信技术&#xff08;Visible Light Communication&#xff0c;VLC&#xff09;是指利用可见光波段的光作为信息载体&#xff0c;在空气中直接传输光信号的通信方式。可见光通信技术绿色低…

virtio vring原理

vring原理 在 virtio 设备上进行批量数据传输的机制被称为 virtqueue 。每个设备可以拥有零个或多个 virtqueue &#xff0c;当 Driver 想要向设备发送数据时&#xff0c;它会填充 Descriptor Table 中的一项&#xff08;或将几项链接在一起&#xff09;&#xff0c;并将描述符…

圣诞树拼图游戏unity制作

2022年圣诞节到来啦&#xff0c;很高兴这次我们又能一起度过~ 一、前言 提示&#xff1a;使用unity来制作一个拼图游戏&#xff0c;图片便是圣诞树。 二、创意名 圣诞树拼图游戏 三、效果展示 圣诞树拼图游戏最终效果。 游戏中效果如图&#xff1a; 游戏拼图完成后效果如图&am…

vue实现随机生成分享海报(内容动态)

大家好&#xff0c;我是雄雄。 前言 昨天写了篇文章&#xff1a;自己整理的vue实现生成分享海报&#xff08;含二维码&#xff09;&#xff0c;看着网上的没实现 主要是介绍了如何使用vue实现&#xff0c;动态分享内容为海报&#xff0c;且附带二维码&#xff0c;扫描二维码能…

shell脚本四剑客之awk详解

文章目录awk的介绍awk能够干什么awk的格式工作原理&#xff1a;记录和域内建变量的用法1. FS2. OFS3.RS4. ORS5. NF6. NRBEGIN 和END语句块常见案例1. 使用NR行号提取ip2. 打印UID小于10的账号名称和UID信息3. 数学运算4. AWK打印硬盘设备名称&#xff0c;默认以空格为分割&…

UDP用户数据报协议(计算机网络-运输层)

目录 UDP 概述 UDP 的主要特点 UDP 的问题 UDP的多路分用模型 UDP 的首部格式 UDP 概述 用户数据报协议&#xff08;User Datagram Protocol&#xff0c;UDP&#xff09; UDP 只在 IP 的数据报服务之上增加了很少一点的功能&#xff0c;即端口的功能和差错检测的功能 虽…

计算机网络——网络层功能概述

网络层 网络层的主要任务是把分组从源端传到目的端&#xff0c;为分组交换网上的不同主机提供通信服务。网络层的传输单位成为数据报。 数据报是一组比较长的数据&#xff0c;分组则是将数据报划分为不同的片段 网络层的第一个功能&#xff1a;路由的选择和分组的转发。 网络层…

python词云图词频统计

目录 一&#xff1a;安装必要的库 二&#xff1a;数据分析 条形图可视化 三&#xff1a;数据分析 词频统计 词云图可视化 一&#xff1a;安装必要的库 导入必要的库 import collections # 词频统计库 import os import re # 正则表达式库 import urllib.error # 指定url&…

WRF进阶:antro_emiss工具处理全球大气人为排放(EDGRA_HTTPs)/人为排放清单前处理

本内容视频版讲解&#xff1a;全球人为排放处理 介绍 一般人为数据的排放前处理使用pre_chen_src工具&#xff0c;然而pre_chen_src处理后的文件并不是WRF所能读取的文件格式&#xff0c;需要使用onvert_emiss.exe&#xff0c;生成WRF需要的人为排放的nc数据。 在WRF-chem3.6…

煤矿视频监控分析检测 yolo

煤矿视频监控分析检测利用python基于yolo深度学习架构&#xff0c;对现场画面进行实时分析检测。我们使用YOLO(你只看一次)算法进行对象检测。YOLO是一个聪明的卷积神经网络(CNN)&#xff0c;用于实时进行目标检测。该算法将单个神经网络应用于完整的图像&#xff0c;然后将图像…

单片机——LED点阵

1. 基本介绍 LED点阵 LED点阵是由发光二极管排列组成的显示器件&#xff0c;通常应用较多的是88点阵&#xff0c;然后通过多个88点阵组成不同分辨率的LED点阵显示屏&#xff0c;如4个88组成的1616点阵 8*8点阵由64个LED组成&#xff0c;每个LED是放置在行线和列线的交叉点上…

LVGL学习笔记3 - 样式Style

目录 1. 初始化样式 2. 设置样式 3. 添加和移除样式 4. 验证 5. 状态&#xff08;State&#xff09; 6. 部分&#xff08;Parts&#xff09; 样式用于设置对象的外观&#xff0c;比如颜色等属性&#xff0c;存储在 lv_style_t 变量中&#xff0c;这个变量应该是static…

不写一行代码(二):实现安卓基于PWM的LED设备驱动

文章目录一、前言二、系列文章三、准备工作3.1 查找PWM引脚3.2 原理图&#xff1a;确认引脚位置3.3 PWM Controller四、查阅PWM bindings五、编写设备树节点5.1 实现节点&#xff1a;pwm-leds5.2 测试命令六、后语一、前言 在完成了基于GPIO的LED设备驱动的文章后&#xff0c;…

3天学会撰写软件发明专利——3.生命周期

“无意中发现了一个巨牛的人工智能教程&#xff0c;忍不住分享一下给大家。教程不仅是零基础&#xff0c;通俗易懂&#xff0c;而且非常风趣幽默&#xff0c;像看小说一样&#xff01;觉得太牛了&#xff0c;所以分享给大家。点这里可以跳转到教程。”。 一、专利授权生命周期…

4.1 协程:协程基础

1.协程 协程&#xff0c;又称微线程。协程是python个中另外一种实现多任务的方式&#xff0c;只不过比线程更小占用更小执行单元&#xff08;理解为需要的资源&#xff09;。 为啥说它是一个执行单元&#xff0c;因为它自带CPU上下文。这样只要在合适的时机&#xff0c; 我们可…

C++类和对象概念及实现详解(上篇)

文章目录 一、什么是类和对象呢&#xff1f; 1、类的引入 2、类的定义 3、类的访问限定符 4、类对象的储存方式 5、this指针的特性 二、类的六个默认成员函数详解 1、构造函数 2、析构函数 3、未完待续…… 标题&#xff1a;类和对象概念及实现详解&#xff08;上篇&#xff0…