当前位置: 首页 > news >正文

JVM7:垃圾回收是什么?从运行时数据区看垃圾回收到底回收哪块区域?垃圾回收如何去回收?垃圾回收策略,引用计数算法及循环引用问题,可达性分析算法

垃圾回收是什么?从运行时数据区看垃圾回收到底回收哪块区域? 垃圾回收如何去回收? 垃圾回收策略 引用计数算法及循环引用问题 可达性分析算法

  • 垃圾回收是什么?从运行时数据区看垃圾回收到底回收哪块区域?
    • 垃圾回收如何去回收?
      • 垃圾回收策略
    • 引用计数算法及循环引用问题
    • 可达性分析算法
  • 思考
  • 汇总

垃圾回收如何去回收?
垃圾回收策略
引用计数算法及循环引用问题
可达性分析算法)

垃圾回收是什么?从运行时数据区看垃圾回收到底回收哪块区域?

请添加图片描述
JVM内存模型认识的差不多了,就应该思考,什么样的内存模型适合什么样的GC策略,包括垃圾回收为什么会出现。实际上,很多东西都是相对应版本的JVM强加上去的。那么垃圾回收是什么?到底回收哪块区域?如何去回收?

这个时候观察运行时数据区来进行分析。
线程私有的区域是完全没有必要回收的,因为方法消亡就消亡了,它的生命周期很短,会伴随着你的方法的退出而消亡,因此不必关心它的回收,而且类文件结构确定之后,就知道整个方法当中字节码指令流转的一个情况了,所以不需要对这块区域进行关心。

线程共享的区域是方法区和堆这两块区域,而方法区MetaSpace中,实际上它的回收有没有呢?有的,但是很少,或者说回收的效率并不高,因为方法区当中的数据是静态变量,常量,字符串常量池,类信息,即时编译后的代码,它的生命周期一般都很长,随着程序运行一段时间之后,它占用方法区的那一块内存会趋于稳定,因为这些东西不回收,所以回收重点关注的地方还是这个区域。因为Java是一门面向对象的一门高级语言,所以对象的创建以及回收才是最重要的。而我们的GC,或者说所谓的垃圾回收,更多的是对于堆内存这块区域的回收,来进行讨论。

那么堆要进行回收的话,到底要怎么去进行回收呢?

垃圾回收如何去回收?

首先需要考虑的第一个问题:什么样的场景下适合使用什么样的垃圾回收策略。
这里注意策略和算法是不一样的,算法是真正落地的实现,而策略不一定要落地。

回收策略按照我们的思想去设计优化的话,首先肯定要关注内存的使用情况,因为垃圾回收本身就是一种穷人策略,因为没有那么多内存共我们去挥霍,所以才会想尽办法提高我们垃圾回收的效率。

垃圾回收策略

  • 收的多: 收的多,意味着收的久。尽可能每次多回收一些对象,尽可能多腾出一些内存,而收的多意味着收的久。
  • 收的快: 收的快,意味着每次收的少需要多次回收。最好可以将时间缩短到一次网络延迟,哪怕回收次数很多都可以容忍,这样收再多次都是无所谓的。

因此会在垃圾回收的时间上和CPU的效率上有个抉择,假设CPU使用率过高,那么可以尽可能的去调低垃圾回收的一个频率,使得CPU的使用率能够在我们接受的范围内,也就是可控性回收

比如我们平时收拾屋子,那么首先就是确定屋子多大,然后哪些东西是垃圾。程序亦是如此,hotsport的开发者也会有这样的想法,它需要有一套判断当前对象是垃圾的依据(或者叫算法)。那么在程序当中,所有的执行逻辑、判断逻辑都可以称之为算法,因为程序就是逻辑+数据组成的。

为什么回收选取操作性较高的数据?
举个例子,你在家里扫垃圾,肯定也是选择比较容易清理的哪些东西叫做垃圾,不好拿的和好拿的肯定先选好拿的。那么在当前的场景中,我们操作性较高的数据是对象,因此是根据对象去进行一个讨论。

而在Java中,引用和对象显然是有关联的,如果要操作对象,必然是会引用来去执行,那么这个时候,最显然的一个办法就是通过引用计数来判断对象是否可以回收,简单的来说,如果一个对象没有任何与之相关联的引用,即它们的引用计数都为0的情况下,也就是说,这个对象没有任何场景下可能会使用到它了,那这个对象就是可回收对象,这就是引用计数法。但是现在Java主流算法并不是这个,因为它难以解决循环引用的问题。

引用计数算法及循环引用问题

/*** 引用计数法难以解决循环引用问题*/
public class CircularReferenceDemo {public static void main(String[] args) {CircularReferenceObject obj1 = new CircularReferenceObject();CircularReferenceObject obj2 = new CircularReferenceObject();/*** 这两句代码表示:* 第一步:虚拟机栈有两个东西obj1、obj2,它是虚拟机栈中的局部变量表中的元素* 第二步:new两个CircularReferenceObject对象,这两个对象是不同的CircularReferenceObject实例,在堆当中共开辟两个内存地址* 第三步:obj1指向堆中的实例1,obj2指向堆中的实例2** 此时此刻,堆中的这两个实例的引用计数应该各自+1=1*/obj1.instance = obj2;obj2.instance = obj1;/*** 让堆中的两个实例互相引用,obj1指向obj2,obj2指向obj1** 此时此刻,堆中的这两个实例的引用计数应该各自再+1=2*/obj1 = null;obj2 = null;/*** 赋值为null,表示不再指向任何数据,即栈中元素不再指向堆中实例** 此时此刻,堆中的这两个实例的引用计数应该各自-1=1** 这个时候,循环引用问腿就来了:按照引用计数法,堆中这两个实例各自的引用计数都不为0,也就是说这两个实例所占用的堆内存空间无法释放** 系统给到实例内存空间但是无法释放的这种情况称之为内存泄露,如果这种情况一直发生,最终会导致内存溢出,因此主流的JVM已经摒弃了这种算法*/}static class CircularReferenceObject {public Object instance = null;}
}

请添加图片描述
对于对象之间的循环引用问题,其实引用计数法它会有策略进行解决,但是这个不是Java应该关心的事情。Java中已经摒弃了引用计数法这种算法,python还在用,引用计数法这种算法的效率会比另一种算法快的多,既然主流的JVM已经摒弃了这种算法,那么必然会出现一种新的算法对它进行替代,来解决循环引用的问题,最少也是让所谓循环引用的问题带来的影响没那么大,那么另一种算法横空出世,就是可达性分析算法。

可达性分析算法

可达性分析算法,也被称为根搜索算法,目前主流的JVM都是采用的这种算法,比如Sun公司的hotsport。
这个算法的核心是从所谓的GC root进行出发,也就是从一个所谓的根进行出发,利用数学中的图论(Graph Theory)知识,从根触发,单条引用链能够到达的对象,便是存活对象,反之即为不可达对象,不可达对象就是需要回收的垃圾。

这里面涉及到两个概念根(所谓的GC root)和可达性。所谓的根、GC root只是一种引用,它并不是对象,它只是告诉你地址,让你知道如何找对象。

哪些可以作为GC root的对象?

  • 虚拟机栈中的局部变量表中的元素Object obj = new Object();,这种new出来的对象,必然是我们需要的对象,所以obj这种位于虚拟机栈中的局部变量表中的元素必然可以作为GC root
  • 方法区的静态变量以及常量
  • 本地方法栈JNI中的元素

思考

引用到底是什么?不同引用会有什么作用?不同引用会不会有不同的监控策略?如果可达性分析算法标记为不可达会立即进行垃圾回收吗?常说的标记整理又是做什么的?

汇总

JVM1:官网了解JVM;Java源文件运行过程、javac编译Java源文件、如何阅读.class文件、class文件结构格式说明、 javap反编译字节码文件;类加载机制、class文件加载方式

JVM2:类加载机制、class文件加载方式;类加载的过程:装载、链接、初始化、使用、卸载;类加载器、为什么类加载器要分层?JVM类加载机制的三种方式:全盘负责、父类委托、缓存机制;自定义类加载器

JVM3:图解类装载与运行时数据区,方法区,堆,运行时常量池,常量池分哪些?String s1 = new String创建了几个对象?初识栈帧,栈的特点,Java虚拟机栈,本地方法发栈,对象指向问题

JVM4:Java对象内存布局:对象头、实例数据、对齐填充;JOL查看Java对象信息;小端存储和大端存储,hashcode为什么用大端存储;句柄池访问对象、直接指针访问对象、指针压缩、对齐填充及排序

JVM5:JVM内存模型与运行时数据区的关系,堆为什么分区,分代年龄,Young区划分,Survivor区为什么分为S0和S1,如何理解各种GC:Partial GC、Full GC、Young GC

JVM6:JVM内存模型验证;使用visualvm查看JVM视图;Visual GC插件下载链接;模拟JVM常见错误,模拟堆内存溢出,模拟栈溢出,模拟方法区溢出

JVM7:垃圾回收是什么?从运行时数据区看垃圾回收到底回收哪块区域?垃圾回收如何去回收?垃圾回收策略,引用计数算法及循环引用问题,可达性分析算法

相关文章:

JVM7:垃圾回收是什么?从运行时数据区看垃圾回收到底回收哪块区域?垃圾回收如何去回收?垃圾回收策略,引用计数算法及循环引用问题,可达性分析算法

垃圾回收是什么?从运行时数据区看垃圾回收到底回收哪块区域? 垃圾回收如何去回收? 垃圾回收策略 引用计数算法及循环引用问题 可达性分析算法 垃圾回收是什么?从运行时数据区看垃圾回收到底回收哪块区域?垃圾回收如何去…...

NFT Insider #104:The Sandbox:全新土地销售活动 Turkishverse 来袭

引言:NFT Insider由NFT收藏组织WHALE Members、BeepCrypto联合出品,浓缩每周NFT新闻,为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周报将从NFT市场数据,艺术新闻类,游戏新闻类,虚拟世界类&#…...

Docker架构及原理

一、Docker的架构图 二、底层原理 Docker是怎么工作的? Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。 容器&#xf…...

VScode使用SSH连接linux

1、官网下载和安装软件 https://code.visualstudio.com/Download 2、安装插件 单击左侧扩展选项,搜索插件安装 总共需要安装的插件如下所示 3、配置连接服务器的账号 安装完后会在左侧生成了远程连接的图标,单击此图标,然后选择设置图标…...

多线程的创建与同步

目录 线程的创建 1.多线程的创建:方式一:继承于Thread类 2.多线程的创建:方式二:实现Runnable 3..线程创建方式三:实现Callable接口 线程的同步 1.同步的方式:方式一:同步代码块 2.…...

LLMs 缩放指令模型Scaling instruct models FLAN(Fine-tuned LAnguage Net,微调语言网络)

本论文介绍了FLAN(Fine-tuned LAnguage Net,微调语言网络),一种指导微调方法,并展示了其应用结果。该研究证明,通过在1836个任务上微调540B PaLM模型,同时整合Chain-of-Thought Reasoning&#…...

政务大厅人员睡岗离岗玩手机识别算法

人员睡岗离岗玩手机识别算法通过pythonyolo系列网络框架算法模型,人员睡岗离岗玩手机识别算法利用图像识别和行为分析,识别出睡岗、离岗和玩手机等不符合规定的行为,并发出告警信号以提醒相关人员。Python是一种由Guido van Rossum开发的通用…...

认识Mybatis的关联关系映射,灵活关联表对象之间的关系

目录 一、概述 ( 1 ) 介绍 ( 2 ) 关联关系映射 ( 3 ) 关联讲述 二、一对一关联映射 2.1 数据库创建 2.2 配置文件 2.3 代码生成 2.4 编写测试 三、一对多关联映射 四 、多对多关联映射 给我们带来的收获 一、概述 ( 1 ) 介绍 关联关系映射是指在数据库中&…...

如何开发一款唯一艺术平台 区块链 /数字藏品

艺术作品是人类文化的瑰宝,而艺术平台则是连接艺术家与观众的桥梁。如何开发一款独一无二的艺术平台,既要满足专业艺术作品展示的要求,又要提供深度思考的空间,这是我们所面临的挑战。本文将从专业性、思考深度和逻辑性等多个方面…...

【UniApp开发小程序】私聊功能后端实现 (买家、卖家 沟通商品信息)【后端基于若依管理系统开发】

声明 本文提炼于个人练手项目,其中的实现逻辑不一定标准,实现思路没有参考权威的文档和教程,仅为个人思考得出,因此可能存在较多本人未考虑到的情况和漏洞,因此仅供参考,如果大家觉得有问题,恳…...

运维高级学习--Kubernetes(K8s 1.28.x)部署

一、基础环境配置(所有主机操作) 主机名规划 序号 主机ip 主机名规划1 192.168.1.30 kubernetes-master.openlab.cn kubernetes-master2 192.168.1.31 kubernetes-node1.openlab.cn kubernetes-node13 192.168.1.32 kubernetes-node2…...

Apache zookeeper kafka 开启SASL安全认证 —— 筑梦之路

简介 Kafka是一个高吞吐量、分布式的发布-订阅消息系统。Kafka核心模块使用Scala语言开发,支持多语言(如Java、Python、Go等)客户端,它可以水平扩展和具有高吞吐量特性而被广泛使用,并与多类开源分布式处理系统进行集成…...

lintcode 1017 · 相似的RGB颜色【进制计算】

题目链接,题目描述 https://www.lintcode.com/problem/1017 在本题中,每个大写字母代表从“0”到“f”的一些十六进制数字。红绿蓝三元色#AABBCC可以简写为#ABC。 例如,#15c是颜色#1155cc的简写。现在,定义两种颜色#ABCDEF和#UV…...

全国首台!浙江机器人产业集团发布垂起固定翼无人机-机器人自动换电机巢

展示突破性创新技术,共话行业发展趋势。8月25日,全国首台垂起固定翼无人机-机器人自动换电机巢新品发布会暨“科创中国宁波”无人机产业趋势分享会在余姚市机器人小镇成功举行。 本次活动在宁波市科学技术协会、余姚市科学技术协会指导下,由浙…...

采用 UML 对软件系统进行建模的基本框架

UML 包括一些可以相互组合为图标的图形元素, 通过提供不同形式的图形来 表述从软件分析开始的软件开发全过程的描述,一个图就是系统架构在某个侧面的 表示,所有的图组成了系统的完整视图。UML 主要提供了以下五类图: &#xff…...

编译tiny4412 Linux 内核

工作环境 Ubuntu 22 交叉编译器 4.5.1 解压Linux内核源码,进入目录 将官方配置完好的defconfig文件作为配置文件 cp tiny4412_linux_defconfig .config由于内核版本较低,需要下载低版本的gcc,选择下载gcc-9与g9 sudo apt install gcc-9 g-…...

Ubuntu22.04安装中文输入法►由踩坑到上岸版◄

Ubuntu22.04安装中文输入法►由踩坑到上岸版◄ 了解入坑上岸 更新一发:Gedit中文乱码问题的解决 为了方便回忆和记录甚至后面继续重装系统,我还是写一下以便将来用到或参考~ 了解 安装Ubuntu22.04(截至2023年08月26日11&#xff…...

SpringBoot简单上手

spring boot 是spring快速开发脚手架,通过约定大于配置,优化了混乱的依赖管理,和复杂的配置,让我们用java-jar方式,运行启动java web项目 入门案例 创建工程 先创建一个空的工程 创建一个名为demo_project的项目,并且…...

git及GitHub的使用

文章目录 git在本地仓库的使用github使用创建仓库https协议连接(不推荐,现在用起来比较麻烦)ssh连接(推荐)git分支操作冲突处理忽略文件 git在本地仓库的使用 1.在目标目录下右键打开git bash here 2.创建用户名和邮箱(注: 下载完…...

【考研数学】线性代数第四章 —— 线性方程组(1,基本概念 | 基本定理 | 解的结构)

文章目录 引言一、线性方程组的基本概念与表达形式二、线性方程组解的基本定理三、线性方程组解的结构写在最后 引言 继向量的学习后,一鼓作气,把线性方程组也解决了去。O.O 一、线性方程组的基本概念与表达形式 方程组 称为 n n n 元齐次线性方程组…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...