JVM(Java Virtual Machine)垃圾收集算法篇

前言

本文参考《深入理解Java虚拟机》,主要介绍GC相关的算法,引用计数法、可达性分析算法、垃圾收集算法(分代收集理论,标记-清除/整理/复制)

本系列其他文章链接:
JVM(Java Virtual Machine)内存模型篇
JVM(Java Virtual Machine)垃圾收集器篇

垃圾收集

当对象不在被使用的时候,就被当做垃圾给GC掉以节省内存空间,而大部分GC都发生在堆内存中,因为这个区域是所有Java线程共享的,最容易OOM的地方

引用计数算法

概念

引用计数算法:在对象中添加一个引用计数器,每当有一个地方引用它的时候,计数器值加一;当一个引用失效的时候,计数器值就减一;任何时刻计数器为0的对象就是不可能再被使用的。

存在问题

在特定情况下,这个效率还是比较高的算法,但是还是会有限问题存在:相互引用导致无法被回收即使他们不在被使用了,如下图示:
在这里插入图片描述
图中,对象56,当他们互相引用,但是却没有人使用他们之中任意一个,使用计数器计数,他们的值永远不为0,就不会被回收,导致内存泄漏的问题。所以,在单独使用计数器是没有办法解决垃圾回收标记问题的。

可达性分析算法

概念

这个算法的基本思路就是通过一系列称为:“GC Roots”的根对象作为起始点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”,如果某个对象到GC Roots间没有任何引用链相连,则说明这个对象不可达,证明此对象不可能再被使用的。如下图所示:在这里插入图片描述

GC Roots对象包括哪些

在Java技术体系,固定可作为GC Roots的对象包括以下几种:

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象
  • 在方法区类静态属性常量引用的对象
  • 本地方法栈中JNI引用对象
  • Java虚拟机内部的引用
  • 所以被同步锁持有的对象

引用

无论是引用计数器还是可达性分析,判断对象的存活都和“引用”离不开关系。

在JDK1.2之前,Java里面的引用是很传统的定义:如果reference类型的数据中存储的数值代表的是另一块内存的起始地址,就称该reference数据是代表某块内存、某个对象的引用。

在JDK1.2之后,Java对引用的概念进行了扩充,将引用分为“强/软/弱/虚引用”,这四种引用强度依次减弱

  • 强引用:这是最传统的,引用赋值,Object o = new Object();
  • 软引用:用来描述一些还有用,但非必要对象,这类对象将在第二次GC被回收,JDK1.2提供了SoftReference实现软引用;
  • 弱引用:用来描述非必须对象,比软引用更弱,第一次GC就会被回收,WeakReference实现弱引用;
  • 虚引用:最弱的一种引用关系。为一个对象设置虚引用关联的唯一目的只是为了能在这个对象被收集器回收收到一个系统通知。PhantomReference类来实现虚引用;

垃圾收集算法

分代收集理论

大多数垃圾收集器都基于“分代收集理论”进行设计,这套理论实际上是一套符合大多数程序运行实际情况的经验法则,它建立在两个假说之上

  • 弱分代假说:绝大多数对象都是朝生夕死;(新生代区域)
  • 强分代假说:熬过越多次垃圾收集过程的对象就越难以消亡;(老年代区域)

依据这个理论,收集器将Java堆划分不同的区域。一个区域放置朝生夕死的对象,一个区域放置熬过多次垃圾收集还“活着”的对象。

对于不同的区域(新生代、老年代),则根据不同的区域使用不同的垃圾收集算法,因此有了“Minor GC”、“Major GC”、“Full GC”,

标记-清除算法

标记-清除算法:首先标记出所需要回收的对象,在标记完成后,统一回收掉所有被标记的对象,或者反过来。这个算法效率是它的优点,因为标记完,回收掉就可以了,不需要其他操作,所有这也成了最大的缺点,容易出现内存碎片,如下图:
在这里插入图片描述
产生大量不连续的内存碎片,可能会导致分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

标记-复制算法

标记-复制算法的底层思想是“半区复制”,它将内存按容量划分大小相等的两块,每次只使用其中一块,当这一块的内存用完了,就将存活的对象复制到另一块上,然后把使用过的那一块清空,等待下一次交换使用。

这样的垃圾收集过程中就只需移动指针位置即可,不会存在内存碎片的问题,实现简单,运行高效,但是这样有一个比较大的问题,内存始终都是有一块在某种意义上是浪费的。

但是为我们所知道的,对象大部分都是朝生夕死的,98%的对象都熬不过第一次垃圾回收,所以并不需要1:1比例来划分新生代的内存空间。在HotSpot虚拟机中,默认分配比例大小是Eden:Survivor(from:to) == 8:1:1,也就是说每次内存分配只使用Eden和Survivor的另一块。

情况如下图所示:
在这里插入图片描述

标记-整理算法

标记-复制算法在对象存活率较高时就要进行较多的复制操作,效率将会降低。更关键的是,如果不想浪费50%的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况,所以在老年代一般不能直接选用这种算法。

标记-整理算法就是让所有存活的对象向一端移动,然后清理掉边界以外的内存。

标记-清除算法与标记-整理算法的本质差异在于前者是一种非移动式的回收算法,后者是移动式的。

END
希望以上内容能给你提供帮助

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

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

相关文章

macrodata数据集在Python统计建模和计量经济学中的应用

目录 一、数据介绍二、应用三、statsmodels 统计模块四、使用 statsmodels 统计模块分析 macrodata.csv 数据集参考 一、数据介绍 macrodata.csv是一个示例数据集,通常用于统计分析和计量经济学中的教育和训练目的。这个数据集通常包括以下列: year&am…

STM32使用WWDG窗口看门狗

1 WWDG 介绍 1.1 WWDG 简介 窗口看门狗 WWDG 其实和独立看门狗类似,它是一个 7 位递减计数器不断的往下递减计数, 当减到一个固定值 0X40 时还不喂狗的话,产生一个 MCU 复位,这个值叫窗口的下限,是固定的值&#xf…

支持语音与视频即时通讯项目杂记(二)

目录 概念: 视频帧(Video Frame)是组成视频的基本单元。它可以被视为一幅静止的图像,它在一定的时间间隔内连续播放,从而形成了流畅的视频。 Changes to Qt Multimedia New features in Qt 6 Removed features C…

居民小区电动汽车有序充电策略研究

摘 要:针对电动汽车在居民小区无序充电对电网系统产生严重隐患及充电间时过长问题,提出一种采用延迟充电的电动汽车有序充电控制策略,并在分析国内外电动汽车有序充电的研究现状后,设计了居民小区电动汽车有序充电策略的总体框架。…

JIT耗时优化

优质博文:IT-BLOG-CN 一、背景 业务流量突增,机器直接接入大量流量QPS2000,JIT和GC会消耗太多CPU资源,导致1-2分钟时间内的请求超时导致异常,因此采用流量预热的方式,让机器逐步接入流量,需要预…

vscode类似GitHub Copilot的插件推荐

由于GitHub Copilot前段时间学生认证的账号掉了很多,某宝激活也是价格翻了几倍,而却,拿来用一天就掉线,可以试试同类免费的插件哦。 例如:TabNine,下载插件后,他会提示你登录,直接登…

spring6-国际化:i18n | 数据校验:Validation

文章目录 1、国际化:i18n1.1、i18n概述1.2、Java国际化1.3、Spring6国际化1.3.1、MessageSource接口1.3.2、使用Spring6国际化 2、数据校验:Validation2.1、Spring Validation概述2.2、实验一:通过Validator接口实现2.3、实验二:B…

关于计算机找不到vcomp140.dll无法继续执行怎么修复

在计算机使用过程中,我们可能会遇到各种问题,其中之一就是vcomp140.dll文件丢失。vcomp140.dll是一个动态链接库文件,它通常用于支持软件运行和系统功能。当这个文件丢失时,可能会导致程序无法正常运行,甚至系统出现错…

分类预测 | MATLAB实现SSA-CNN-BiLSTM麻雀算法优化卷积双向长短期记忆神经网络数据分类预测

分类预测 | MATLAB实现SSA-CNN-BiLSTM麻雀算法优化卷积双向长短期记忆神经网络数据分类预测 目录 分类预测 | MATLAB实现SSA-CNN-BiLSTM麻雀算法优化卷积双向长短期记忆神经网络数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现SSA-CNN-BiLSTM数据…

大厂秋招真题【贪心】大疆20230813秋招T1-矩形田地

题目描述与示例 题目描述 给定一个矩形田地,其高度为 h 且宽度为 w。同时,你将获得两个整数数组 horizontalCutting 和 verticalCutting,其中 horizontalCutting[i] 表示从矩形田地顶部到第 i 个水平切口的距离,verticalCutting…

使用CountdownLatch和线程池批量处理http请求,并处理响应数据

背景和问题 ​ 背景:最近项目的一个接口数据,需要去请求其他多个服务器的数据,然后统一返回; 问题点:如果遍历所有的服务器地址,然后串行请求就会出现请求时间过长,加入需要请求十个服务器&…

解决谷歌学术bib信息不全的问题

在我们撰写学术论文时,经常需要引用参考文献。如果用latex撰写论文,势必会用到文献的bib信息,大部分的教程都会告诉我们去google scholar上去搜索。 一、问题描述 搜索一篇文章,然后选择cite,再选择bib。 很明显&…

Node学习笔记之MySQL基本使用

使用 SQL 管理数据库 其实写接口简单来说就是操作数据库数据,所以我们需要学会数据库的增、删、查、改等基本操作 1. 什么是 SQL SQL(英文全称:Structured Query Language)是结构化查询语言,专门用来访问和处理数据…

(2)Nmap

笔记目录 渗透测试工具(1)wireshark渗透测试工具(2)Nmap渗透测试工具(3)BurpsuiteAWD比赛(1)AWD入门攻略大纲 1.工具简介 (1)定义 ①功能 网络扫描和嗅探工具包,三个主要基本功能: 探测一组主机是否在线 扫描主机端口、嗅探所提供的网络服务 推断出主…

Keil实现Flash升级跳转(STM32/GD32/HC32)

编写BOOT程序,和APP程序。 BOOT程序检查OTA参数,执行OTA升级,然后跳转到APP代码。 记录一下跳转APP需要修改得东西: 1、BOOT程序 修改跳转地址 先检查APP地址是否有效 然后关闭外设 反初始化 设置MSP指针,进行跳转 …

ZooKeeper+HBase分布式集群环境搭建

安装版本:hadoop-2.10.1、zookeeper-3.4.12、hbase-2.3.1 一、zookeeper集群搭建与配置 1.下载zookeeper安装包 2.解压移动zookeeper 3.修改配置文件(创建文件夹) 4.进入conf/ 5.修改zoo.cfg文件 6.进入/usr/local/zookeeper-3.4.12/zkdata…

Vue 模板字符串碰到script无法识别,报错Parsing error: Unterminated template.

需求: 将js代码完整的显示在界面上,包括标签 代码如下: 报错信息如下: 我们在上图中可以看到模板字符串加入了script标签后会报错 原因:运行JS的时候由上至下,先识别模板字符串里面的script标签&#xf…

基于B/S架构,包括PC后台管理端、APP移动端、可视化大屏端的智慧工地源码

智慧工地管理平台充分运用数字化技术,聚焦施工现场岗位一线,依托物联网、互联网、AI等技术,围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程…

计算机网络,网络(OSI)七层模型,三次握手四次挥手,get与post请求区别,网络IO(BIO\NIO\AIO),TCP与UDP区别

1.OSI模型? 开放式系统互联通信参考模型(Open System Interconnection Reference Model) OSI网络七层模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层 TCP/IP协议群简化了OSI七层模型:应用层、传输层、网络层、数据链路…

自然语言处理---文本预处理概述

自然语言处理(Natural Language Processing,简称NLP)是计算机科学与语言学中关注于计算机与人类语言间转换的领域。其主要应用于:语音助手、机器翻译、搜索引擎、智能问答等。 文本预处理概述 文本语料在输送给模型前一般需要一…