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

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

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

相关文章

(java) 进程调度

目录 进程 首先我们要了解一下什么是进程? 那如何管理进程? PCB中比较重要的属性 进程调度 为什么要进行进程调度? 状态 优先级 上下文 拓展介绍一下寄存器 记账信息 进程 首先我们要了解一下什么是进程? 简单来说…

网络电子词典

一、项目要求: 1. 登录注册功能,不能重复登录,重复注册 2. 单词查询功能 3. 历史记录功能,存储单词,意思,以及查询时间 4. 基于TCP,支持多客户端连接 5. 采用数据库保存用户信息与历史记录…

java: 无法访问org.springframework.boot.SpringApplication 错误的类文件

项目场景: 提示:这里简述项目相关背景: 错误1: java: 无法访问org.springframework.boot.SpringApplication 错误的类文件: /D:/Software/env-java/apache-maven-3.6.1/repository/org/springframework/boot/spring-boot/3.1.2/sp…

C#,《小白学程序》第四课:数学计算

1 文本格式 /// <summary> /// 《小白学程序》第四课&#xff1a;数学计算 /// 这节课超级简单&#xff0c;就是计算成绩的平均值&#xff08;平均分&#xff09; /// 这个是老师们经常做的一件事。 /// </summary> /// <param name"sender"></…

图片换脸-->>视频换脸-->>直播换脸

资源网站&#xff1a;https://tianfeng.space/ 个人娱乐&#xff0c;切勿作恶 下载 ​ 网盘&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1DHMY1mCXpT0OtpmlvIoMKA 提取码&#xff1a;nf57 使用 下载解压后&#xff0c;打开 第一个就是你要替换的人脸&#xff0c;…

MyCAT命令行监控

9066端口 &#xff0c;用mysql命令行连接 Mysql –utest –ptest –P9066 show help 可显示所有相关管理命令 显示后端物理库连接信息&#xff0c;包括当前连接数&#xff0c;端口 Show backend Show connection 显示当前前端客户端连接情况&#xff0c;已经网络流量信息、…

再见 Xshell替代工具Tabby

替代Xshell 之前经常使用Xshell来操作Linux虚拟机&#xff0c;基本上是够用了。但是Xshell免费使用只供非商业用途&#xff0c;而且如果你想用FTP来进行文件传输的话&#xff0c;还需单独下载Xftp。 无意中发现了另一款开源的终端工具Tabby&#xff0c;它直接集成了SFTP功能&…

Qt XML文件解析 QDomDocument

QtXml模块提供了一个读写XML文件的流&#xff0c;解析方法包含DOM和SAX,两者的区别是什么呢&#xff1f; DOM&#xff08;Document Object Model&#xff09;&#xff1a;将XML文件保存为树的形式&#xff0c;操作简单&#xff0c;便于访问。 SAX&#xff08;Simple API for …

渗透测试工具ZAP入门教程(1)-安装和快速开始

介绍 ZAP Zed Attack Proxy&#xff08;ZAP&#xff09;是一个免费的开源渗透测试工具&#xff0c;在 软件安全项目 &#xff08;SSP&#xff09;。ZAP 专为测试 Web 应用程序而设计&#xff0c;既灵活又可扩展。 ZAP的核心是所谓的“中间人代理”。它位于测试人员的浏览器和…

go学习-指针 标识符

指针&#xff0c;以及标识符 1.指针 &#xff08;1&#xff09;.基本介绍 1&#xff09;基本数据类型&#xff0c;变量存的值&#xff0c;也叫值类型 2&#xff09;获取变量的地址用&&#xff0c;比如 var num int ,获取num的地址&#xff1a;&num 3)指针类型&…

Yolo系列-yolov2

YOLO-V2 更快&#xff01;更强&#xff01; YOLO-V2-BatchNormalization BatchNormalization&#xff08;批归一化&#xff09;是一个常用的深度神经网络优化技术&#xff0c;它可以将输入数据进行归一化处理&#xff0c;使得神经网络更容易进行学习。在YOLOv2中&#xff0c;B…

promise

promise 属于事件循环的微任务&#xff0c;具体详见&#xff1a;事件循环 Promise 语法: const p1 new Promise((reslove,reject)>{console.log(2);reslove(1) }).then((data)>{console.log(3);console.log(data) }).catch((data)>{console.log(3); }) promise.th…

基于Milvus Cloud的相似穿搭推荐系统教程——图像分割

作为一个大众眼中的“非典型程序员”,我喜欢拥抱时尚和潮流,比如我经常在演讲时穿粉色裤子,这甚至已经成为一个标志性打扮。某天又逢主题演讲日,我站在衣柜前挑选上衣的时候,忽然灵光乍现:有没有可能借助 Milvus Cloud找到和我穿搭风格最为相似的明星呢? 这个想法在我脑…

Oracle给表空间添加容量

假如给SYSTEM表空间添加 查看文件位置和容量&#xff1a;Select * FROM DBA_DATA_FILES; FILE_NAME就是要修改的文件 查看每一个表空间的容量&#xff0c;单位MB&#xff1a; SELECT t.tablespace_name, round(SUM(bytes / (1024 * 1024)), 0) ts_size FROM dba_tablespaces…

部分调试记录

Ubuntu16.04纯命令行安装VMwareTools hudahuahudahua-virtual-machine:~$ sudo apt-get install open-vm-tools -yhudahuahudahua-virtual-machine:~$ sudo apt-get install open-vm-tools-desktop无法加载so文件&#xff0c;版本问题 [rootdragonboard /]# ./Qserial -qws .…

sql server删除历史数据

1 函数 datediff函数: DATEDIFF ( datepart , startdate , enddate )datepart的取值可以是year,quarter,Month,dayofyear,Day,Week,Hour,minute,second,millisecond startdate 是从 enddate 减去。如果 startdate 比 enddate 晚&#xff0c;返回负值。 2 例子 删除2023年以…

2023前端面试笔记 —— CSS3

系列文章目录 内容链接2023前端面试笔记HTML52023前端面试笔记CSS3 文章目录 系列文章目录前言一、CSS选择器的优先级二、通过 CSS 的哪些方式可以实现隐藏页面上的元素三、px、em、rem之间有什么区别&#xff1f;四、让元素水平居中的方法有哪些五、在 CSS 中有哪些定位方式六…

DETRs with Collaborative Hybrid Assignments Training论文笔记

Title&#xff1a;[DETRs with Collaborative Hybrid Assignments Training Code 文章目录 1. Motivation2. one to one VS one to many3. Method&#xff08;1&#xff09;Encoder feature learning&#xff08;2&#xff09;Decoder attention learning 1. Motivation 当前…

正确进行自动化测试

前言&#xff1a; &#x1f4d5;作者简介&#xff1a;热爱编程的小七&#xff0c;致力于C、Java、Python等多编程语言&#xff0c;热爱编程和长板的运动少年&#xff01; &#x1f4d8;相关专栏Java基础语法&#xff0c;JavaEE初阶&#xff0c;数据库&#xff0c;数据结构和算法…

论文阅读及复现——《CT_ICP: Real-time Elastic LiDAR Odometry with Loop Closure》

论文阅读之——《CT_ICP: Real-time Elastic LiDAR Odometry with Loop Closure》带闭环的实时弹性激光雷达里程计 1. 主要贡献2. 相关说明3. 激光里程计3.1 里程计公式构建3.2 局部地图与健壮性 4. 回环检测与后端5. 实验结果5.1 里程计实验结果5.2 回环检测实验结果 6. 总结…