【JVM】一篇通关JVM垃圾回收
目录
- 1. 如何判断对象可以回收
- 1-1. 引用计数法
- 1-2. 可达性分析算法
- 1-3. 四种引用
- 强引用
- 软引用
- 弱引用
- 虚引用
- 终结器引用
- 2. 垃圾回收算法
- 2-1. 标记清除
- 2-2. 标记整理
- 2-3. 复制
- 2-4. 总结
- 3. 分代垃圾回收
- 4. 垃圾回收器
- 5. 垃圾回收调优
1. 如何判断对象可以回收
1-1. 引用计数法
引用计数法
- 只要一个对象被其他变量所引用,那么就让这个对象的计数
+1 - 如果其他变量不再引用,让这个对象的计数
-1 - 让这个对象的引用计数为
0时,则说明没有变量引用了,就可以作为一个垃圾进行回收
引用计数法弊端
- 循环引用问题,A对象与B对象循环引用,他们的引用计数始终为1,不能作为一个垃圾进行回收
- 出现内存泄漏

1-2. 可达性分析算法
根对象:一些肯定不能作为垃圾的对象
可达性分析算法
-
在垃圾回收之前,会对堆内存所有的对象进行扫描
-
查看每一个对象是不是被
根对象直接或间接引用 -
如果是,则不能被垃圾回收
-
如果不是,则可以被垃圾回收
-
Java虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象
-
扫描堆中的对象,看是否能够沿着GC Root对象
(堆中对象)为起点的引用链找到该对象,找不到,表示堆中对象可以回收 -
哪些对象可以作为GC Root
- 活动线程中局部变量
所引用的堆中对象可以作为根对象
- 活动线程中局部变量
1-3. 四种引用
实线代表强引用
平时用的引用都是强引用,例如:赋值运算

强引用
- 所有 GC Roots 对象都不通过【强引用】引用该对象,该对象才能被垃圾回收。
软引用
- 只有【软引用】引用该对象时,在垃圾回收后,内存仍不足 则会回收软引用对象
- 可以配合【引用队列】来释放软引用自身,因为软引用自身也占用内存
★应用场景
- 非核心业务资源(比如:图片)被强引用特别多时,有可能报OOM异常,因为强引用是不会被回收的,内存满直接抛异常
- 那么就可以用【软引用】来指向这些资源,当内存不足时,回收这些资源。
- 以后如果再使用图片资源,重新读取一遍。
弱引用
- 只有【弱引用】引用该对象时,在垃圾回收时,无论内存是否充足,都会回收弱引用对象
- 可以配合【引用队列】来释放弱引用自身,因为弱引用自身也占用内存
虚引用
- 必须配合【引用队列】使用
- 例如
ByteBuffer对象不再【强引用】时,ByteBuffer对象本身可以被垃圾回收,但是占用的直接内存是属于操作系统的,无法被回收。 - 那么就可以将【虚引用】放入【引用队列】, 由
Reference Handler线程调用虚引用相关方法释放【直接内存】 - 总结:【虚引用】引用的对象被垃圾回收时,【虚引用】被放入【引用队列】,从而由一个线程可以调用【虚引用】的方法。
终结器引用
Object类中有finallize()方法- 当一个类重写了
Object类中有finallize()方法,并且该对象没有被【强引用】时,就可以进行垃圾回收 - 第一次垃圾回收时,将【终结器引用】放入【引用队列】,并且由一个优先级很低的Finalizer线程去寻找【终结器引用】的对象,找到后执行该对象的
finallize()方法。 - 直到第二次垃圾回收时,才将该对象进行垃圾回收。
软引用使用:
public class Demo1 {public static void main(String[] args) {final int _4M = 4*1024*1024;//list是强引用,byte数组是软引用List<SoftReference<byte[]>> list = new ArrayList<>();SoftReference<byte[]> ref= new SoftReference<>(new byte[_4M]);}
}
软引用配合引用队列使用:
public static void main(String[] args) throws IOException {///使用引用队列,用于移除引用为空的软引用ReferenceQueue<byte[]> queue=new ReferenceQueue<>();List<SoftReference<byte[]>> list = new ArrayList<>();for (int i = 0; i < 5; i++) {//关联了引用队列,当软引用所关联的byte数组被回收时,软引用自己就会加入到引用队列queue中去SoftReference<byte[]> ref = new SoftReference<>(new byte[_4MB],queue);System.out.println(ref.get());list.add(ref);System.out.println(list.size());}//获取队列中第一个软引用Reference<? extends byte[]> poll = queue.poll();//遍历引用队列,如果有软引用,则移除while(poll!=null){list.remove(poll);poll=queue.poll();}System.out.println("=============");System.out.println("循环结束:" + list.size());for (SoftReference<byte[]> ref : list) {System.out.println(ref.get());}
}
弱引用使用:
弱引用的使用和软引用类似,只是将 SoftReference 换为了 WeakReference
public static void main(String[] args) {//list是强引用,byte数组是弱引用List<WeakReference<byte[]>> list=new ArrayList<>();for (int i = 0; i < 5; i++) {WeakReference<byte[]> ref=new WeakReference<>(new byte[_4MB]);list.add(ref);for (WeakReference<byte[]> w : list) {System.out.print(w.get()+" ");}System.out.println();}System.out.println("循环结束:"+list.size());
}
2. 垃圾回收算法
2-1. 标记清除

标记清除
在垃圾回收的过程中
- 标记:确定哪些对象是可回收对象,
- 清除:标记好之后,清除可回收对象的内存,
并不是将内存空间字节清零,而是记录内存起始地址。
注意:这里的清除并不是将内存空间字节清零,而是记录这段内存的起始地址,下次分配内存的时候,会直接覆盖这段内存。
优点: 速度快
缺点: 容易产生内存碎片。一旦分配较大内存的对象,由于内存不连续,导致无法分配,最后就会造成内存溢出问题
2-2. 标记整理

标记整理
- 先采用标记算法确定可回收对象
- 然后整理剩余的对象内存,将可用的对象内存移动到一起,使内存更加紧凑,连续的空间就更多。
优点:不会有内存碎片
缺点:速度慢
2-3. 复制


复制算法
- 将内存分为等大小的两个区域,FROM和TO(TO中为空)。
- 将被GC Root引用的对象从FROM放入TO中,然后回收不被GC Root引用的对象。
- 回收完之后交换FROM和TO两个区域。这样也可以避免内存碎片的问题,但是会占用双倍的内存空间。
优点:不会有内存碎片
缺点:会占用双倍的内存空间。速度慢
2-4. 总结
- JVM会根据不同的情况来采用这3种算法
- 不会只使用一种算法
3. 分代垃圾回收
4. 垃圾回收器
5. 垃圾回收调优
相关文章:
【JVM】一篇通关JVM垃圾回收
目录 1. 如何判断对象可以回收1-1. 引用计数法1-2. 可达性分析算法1-3. 四种引用强引用软引用弱引用虚引用终结器引用 2. 垃圾回收算法2-1. 标记清除2-2. 标记整理2-3. 复制2-4. 总结 3. 分代垃圾回收4. 垃圾回收器5. 垃圾回收调优 1. 如何判断对象可以回收 1-1. 引用计数法 …...
【小沐学写作】原型设计工具汇总(Axure RP)
文章目录 1、简介2、Axure RP2.1 工具简介2.2 工具特点2.2.1 互动事件2.2.2 条件逻辑2.2.4 工作表格2.2.5 多状态容器2.2.6 数据驱动接口2.2.7 自适应视图2.2.8 流程图 2.3 工具安装2.3.1 安装2.3.2 运行 2.4 使用费用2.5 工具体验2.5.1 登陆框制作 3、其他3.1 Figma3.2 Adobe …...
WebSocket 鉴权策略与技巧详解
WebSocket 作为实时通信的利器,越来越受到开发者的青睐。然而,为了确保通信的安全性和合法性,鉴权成为不可或缺的一环。本文将深入探讨 WebSocket 的鉴权机制,为你呈现一揽子的解决方案,确保你的 WebSocket 通信得心应…...
2022 年十大 JavaScript 框架
2022 年十大 Web 应用开发 JavaScript 框架。 React.js jQuery Express Angular Vue.js Angular.js Svelte Next.js Ember.js Meteor React.js React.js 于 2013 年由 Meta(Facebook 前身) 推出,是一款开源的、免费的 JavaScript 库。React.js 被用于开…...
Java中的线程池
目录 1、线程池的概念及其用途 2、Java中的线程池是如何创建和使用的 扩展:有哪些不同类型的线程池? 3、Java中线程池有哪些常见的应用场景? 4、线程池在Web应用中的使用情况 5、线程池如何管理多线程请求处理 1、线程池的概念及其用途…...
excel单元格加背景颜色不生效?
如果在 Excel 中设置单元格背景颜色而发现不生效,可能有几个原因。以下是一些常见的解决方法: 1. **单元格锁定:** 检查所在单元格是否被锁定。如果单元格被锁定,并且工作表被保护,你可能无法更改其背景颜色。在工作表…...
鸿蒙开发板——环境搭建(南派开发)
概述 为了帮大家理清楚鸿蒙开发的套路,我们从头再梳理一遍相关的脉络。并为大家总结一些重点性的内容。在介绍OpenHarmony特性前,需要大家先明确以下两个基本概念: 子系统 OpenHarmony整体遵从分层设计,从下向上依次为…...
【C++代码】链表
算法:搜索、查找、排序、双指针、回溯、分治、动态规划、贪心、位运算、数学等。 数据结构:数组、栈、队列、字符串、链表、树、图、堆、哈希表等。 数据结构是为实现对计算机数据有效使用的各种数据组织形式,服务于各类计算机操作。不同的…...
01、Tensorflow实现二元手写数字识别
01、Tensorflow实现二元手写数字识别(二分类问题) 开始学习机器学习啦,已经把吴恩达的课全部刷完了,现在开始熟悉一下复现代码。对这个手写数字实部比较感兴趣,作为入门的素材非常合适。 基于Tensorflow 2.10.0 1、…...
HCIA-Datacom跟官方路线学习第二部分
接着前面第六章,通过VLAN技术, 可以将物理的局域网划分成多个广播域, 实现同一VLAN内的网络设备可以直接进行二层通信, 不同VLAN内的设备不可以直接进行二层通信。 第七章 生成树 在以太网交换网络会使用冗余链路, 但…...
BIO、NIO和AIO的区别
一、基础知识: I/O 模型的简单理解: 1.BIO(Blocking I/O):同步阻塞,一个线程处理一个通道上的事件。 2.NIO(Non-blocking I/O):同步非阻塞,使用选择器&…...
makefile 学习(5)完整的makefile模板
参考自: (1)深度学习部署笔记(二): g, makefile语法,makefile自己的CUDA编程模板(2)https://zhuanlan.zhihu.com/p/396448133(3) 一个挺好的工程模板,(https://github.com/shouxieai/cpp-proj-template) 1. c 编译流…...
专业远程控制如何塑造安全体系?向日葵“全流程安全闭环”解析
安全是远程控制的重中之重,作为国民级远程控制品牌,向日葵远程控制就极为注重安全远控服务的塑造。近期向日葵发布了以安全和核心的新版“向日葵15”以及同步发布《贝锐向日葵远控安全标准白皮书》(下简称《白皮书》),…...
node.js解决输出中文乱码问题
个人简介 👨🏻💻个人主页:九黎aj 🏃🏻♂️幸福源自奋斗,平凡造就不凡 🌟如果文章对你有用,麻烦关注点赞收藏走一波,感谢支持! 🌱欢迎订阅我的…...
CentOS 7 使用异步网络框架Libevent
CentOS 7 安装Libevent库 libevent github地址:https://github.com/libevent/libevent 步骤1:首先,你需要下载libevent的源代码。你可以从github或者源代码官方网站下载。并上传至/usr/local/source_code/ 步骤2:下载完成后&…...
枚举 B. Lorry
Problem - B - Codeforces 题目大意:给物品数量 n n n,体积为 v ( 0 ≤ v ≤ 1 e 9 ) v_{(0 \le v \le 1e9)} v(0≤v≤1e9),第一行读入 n , v n, v n,v,之后 n n n行,读入 n n n个物品,之后每行依次是体…...
ON1 Photo RAW 2024 for Mac——专业照片编辑的终极利器
ON1 Photo RAW 2024 for Mac是一款专为Mac用户打造的照片编辑器,以其强大的功能和易用的操作,让你的照片编辑工作变得轻松愉快。 一、强大的RAW处理能力 ON1 Photo RAW 2024支持大量的RAW格式照片,能够让你在编辑过程中获得更多的自由度和更…...
从word复制内容到wangEditor富文本框的时候会把html标签也复制过来,如果只想实现直接复制纯文本,有什么好的实现方式
从word复制内容到wangEditor富文本框的时候会把html标签也复制过来,如果只想实现直接复制纯文本,有什么好的实现方式? 将 Word 中的内容复制到富文本编辑器时,常常会带有大量的 HTML 标签和样式,这可能导致不必要的格式…...
项目中如何配置数据可视化展现
在现今数据驱动的时代,可视化已逐渐成为数据分析的主要途径,可视化大屏的广泛使用便应运而生。很多公司及政务机构,常利用大屏的手段展现其实力或演示业务,可视化的效果能让观者更快速的理解结果并直观的看到数据展现。因此&#…...
ArkUI开发进阶—@Builder函数@BuilderParam装饰器的妙用与场景应用
ArkUI开发进阶—@Builder函数@BuilderParam装饰器的妙用与场景应用 HarmonyOS,作为一款全场景分布式操作系统,为了推动更广泛的应用开发,采用了一种先进而灵活的编程语言——ArkTS。ArkTS是在TypeScript(TS)的基础上发展而来,为HarmonyOS提供了丰富的应用开发工具,使开…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...
Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...
自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
