学习笔记JVM篇(三)

一、垃圾回收机制

垃圾回收(Garbage Collection)机制,是自动回收无用对象从而释放内存的一种机制。Java之所以相对简单,很大程度是归功于垃圾回收机制。(例如C语言申请内存后要手动的释放)

优点:简化了开发难度,同时让内存分配更合理。

缺点:屏蔽了底层,同时垃圾回收也会在一定程度上影响程序的性能。

二、如何确定垃圾

可达性分析算法

(1)有了垃圾回收机制,那接下来就是要讨论了的是如何确定内存中那些对象是垃圾。通常JVM会采用可达性分析算法来确定某个对象是否为垃圾对象。可达性分析算法是通过一些列的GCRoot(后续再介绍),通过引用链的方式找到所有的对象,如果一个对象没有与任何GCRoot相连接,则可以认为该对象为垃圾对象。如下图

Object6、7、8、9就是垃圾对象,之后的GC会将其回收。

(2)什么是GCRoot对象呢

GCRoot对象是JVM认为存活的对象,是理解回收的起点。JVM中的GCRoot通常包含以下几种

- 虚拟机栈中引用的对象
- 静态变量
- 常量
- 本地方法JNI引用的对象

(3)使用可达性分析算法可以解决引用计数法带来因为循环引用而导致的内存泄露问题。

例如 A对象引用B,B对线引用A,而两者其实都是null。如果采用引用计数法则不会被认定为垃圾,最终会导致内存泄露;如果内存泄露一直置之不理则可能会引发OOM。

三、垃圾回收算法

1、垃圾回收算法和垃圾回收器的关系

垃圾回收算法一种方法论,用于指导如何回收垃圾;而垃圾回收器则是对不同的垃圾回收算法进行实现,从而回收JVM中的垃圾。简单的来说垃圾回收器是垃圾回收算法的实现和落地。

2、标记清除

标记清除算法,标记清除算法分两步走。第一步:标记垃圾,第二步:清除垃圾。首先垃圾回收器会从GCRoot出发标记出所有的垃圾对象;第二步将标记出的垃圾清除掉。

优点:实现简单,容易理解,能够回收不连续的空间。

缺点:

(1)标记清理分为两步,垃圾回收器需要遍历两次内存,相对来说速度较慢。

(2)标记出来的理解可能分布在内存的不同地方,清除之后容易出现内存碎片。举个例子,清理了100个垃圾对象,每个对象1M,所以能空闲出100M的内存,但是由于垃圾是分布在内存的不同区域,就导致这些内存是不连续的,虽然总共清理出100M,但是此时如果想要存入一个100M的对象是做不到的。

所以,标记清除算法多用于不需要频繁垃圾回收的场景。

3、标记整理

在标记清除的基础上,将存活的对象进行整理,从而减少内存碎片。JVM从GCRoot开始标记出垃圾对象,然后将所有存活的对象压缩的内存的一段,同时记录下边界,然后清除边界之外的垃圾

优点:不存在内存碎片

缺点:效率比标记复制要低一些,因为对象移动了,需要调整虚拟机栈中的引用。

标记整理适合存活对象多,垃圾对象少。

4、标记复制

标记算法需要讲内存一份为二(这里我们简称A和B)。标记复制算法分为三步。第一步通过GCRoot确定那些不是垃圾对象(存活对象),第二步将这存活的对象从内存A区域复制到B区域,第三步清除A所有的对象。

优点:效率相对较高,不会有内存碎片

缺点:内存的利用率低

标记复制算法不适合大量存活对象的场景(例如老年代,大多数对象是存活的),因为大量对象存活意味着大量的对象要被复制,这样效率就很低。反过来,标记复制算法就适合在新生代中,因为新生代中的对象大多数都是“朝生夕死”存活时间很短。

4、分代算法

分代算法是结合了上述几个算法,根据JVM不同区域垃圾对象的特点使用不同的垃圾回收算法。例如新生代的对象特点是,绝大多数的对象“朝生夕死”,所以使用标记复制是最合理的。而老年代的对象经过了一次又一次的垃圾回收都是比较稳定的对象,通常大部分对象是存活的,所以更适合使用标记整理算法。

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

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

相关文章

数据清洗-缺失值填充-K-NN算法(K-Nearest Neighbors, K-NN算法)

目录 一、安装所需的python包二、采用K-NN算法进行缺失值填充2.1可直接运行代码2.2以某个缺失值数据进行实战2.2.1代码运行过程截屏:2.2.2填充后的数据截屏: 三、K 近邻算法 (K-Nearest Neighbors, KNN) 介绍3.1 K 近邻算法定义3.2 K 近邻算法的基本思想…

福建科立讯通信 指挥调度管理平台 SQL注入漏洞

北峰通信-福建科立讯通信 指挥调度管理平台 SQL注入漏洞 厂商域名和信息收集 域名: 工具sqlmap python sqlmap.py -u "http://ip:端口/api/client/down_file.php?uuid1" --batch 数据包 GET /api/client/down_file.php?uuid1%27%20AND%20(SELECT%20…

替换 Oracle ,江河信息用 TDengine 解决高基数查询写入问题

在数字经济快速发展的背景下,智慧水利作为重要的基础设施之一,正逐步成为提升水资源管理效率、优化生态环境的重要力量。江西省水投江河信息技术有限公司(以下简称“江河信息”)作为高新技术国有企业,坚定致力于打造数…

Leetcode 每日一题:Longest Increasing Path in a Matrix

写在前面: 今天我们继续看一道 图论和遍历 相关的题目。这道题目的背景是在一个矩阵当中找寻最长的递增数列长度。思路上非常好想,绝对和 DFS 相关,但是题目的优化要求非常高,对于语言和内存特性的考察特别丰富,如果是…

15. Springboot集成Redis

目录 1、前言 2、为什么选择Spring Boot集成Redis? 3、快速上手 3.1、引入依赖 3.2、 配置连接信息 3.3、自定义配置类 4、RedisTemplate的使用 4.1、String类型操作 4.2、 Hash类型操作 4.3、List类型操作 4.4、Set类型操作 4.5、SortedSet类型操作 4…

第十一章 【后端】商品分类管理微服务(11.2)——Lombok

11.2 Lombok 官网:https://projectlombok.org/ 较新版本的 idea 已默认安装 lombok 插件 Lombok 工具提供一系列的注解,使用这些注解可以不用定义 getter、setter、equals、constructor 等,可以消除 java 代码的臃肿,编译时它会在字节码文件中自动生成这些通用的方法,简…

ElK 8 收集 Nginx 日志

1. 说明 elk 版本:8.15.0 2. 启个 nginx 有 nginx 可以直接使用。我这里是在之前环境下 docker-compose.yml 中启动了个 nginx: nginx:restart: alwaysimage: nginx:1.26.1ports:- "80:80"- "443:443"volumes:#- ./nginx/html:/…

【题解】—— LeetCode一周小结37

🌟欢迎来到 我的博客 —— 探索技术的无限可能! 🌟博客的简介(文章目录) 【题解】—— 每日一道题目栏 上接:【题解】—— LeetCode一周小结36 9.合并零之间的节点 题目链接:2181. 合并零之间…

Unity实战案例全解析:PVZ 植物放置分析

前篇:Unity实战案例全解析:PVZ 植物卡片状态分析-CSDN博客 植物应该如何从卡牌状态转为实物? 其实就只需要考虑两个步骤加一个后续处理: 1.点击卡牌后就实例化 需要一个植物状态枚举,因为卡牌分为拿在手上和种植下…

CS61C 2020计算机组成原理Lecture01-数字表示,溢出

1. 原码 原码就是符号化的数值,其编码规则简单直观:正数符号位用0表示,负数符号位用1表示,数值位保持不变。 x0.1101,则[x]原0.1101;x1101,则[x]原01101x -0.1111,则[x]原1.1111&…

Oracle从入门到放弃

Oracle从入门到放弃 左连接和右连接Where子查询单行子查询多行子查询 from子句的子查询select子句的子查询oracle分页序列序列的应用 索引PL/SQL变量声明与赋值select into 赋值变量属性类型 异常循环游标存储函数存储过程不带传出参数的存储过程带传出参数的存储过程 左连接和…

opencv之Canny边缘检测

文章目录 前言1.应用高斯滤波去除图像噪声2.计算梯度3.非极大值抑制4.应用双阈值确定边缘5.Canny函数及使用 前言 Canny边缘检测是一种流行的边缘检测算法,用于检测图像中的边缘。它通过一系列步骤将图像中的像素边缘突出显示出来,主要分为以下几个步骤…

PCL 点云随机渲染颜色

目录 一、概述 1.1原理 1.2实现步骤 1.3 应用场景 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总(长期更新) 一、概述 本文将介绍如何使用PCL库…

uniapp升级Vue3:避坑指南与步骤详解

为什么要升级到 Vue3 Vue3 是 Vue.js 的最新版本,相比 Vue2,它带来了许多改进和新特性,比如更小的包体积、更好的性能、更强大的组合式 API 等。通过升级到 Vue3,我们可以享受到这些新特性带来的好处,提升项目的开发效…

模拟视频推到WVP推流列表

效果 1. wvp创建RTMP 2. 使用ffmpeg将本地的视频转为rtmp ffmpeg -re -i F:rtsp\123.mp4 -c copy -f flv rtmp://192.168.1.237:1935/cd/10001?sign=Z4Y3eYeSg

计算机网络408考研 2022

https://zhuanlan.zhihu.com/p/695446866 1 1 1SDN代表软件定义网络。它是一种网络架构,旨在通过将网络控制平面从数据转发平面分离出来,从而实现网络的灵活性和可编程性。在SDN中,网络管理员可以通过集中式控制器 来动态管理网络流量&…

Google高级应用

网站管理员中心 Google Search Console 谷歌高级搜索:https://www.google.com.hk/advanced_search?hlzh-CN&fg1 基础语法 AND/强迫包含NOT/-除去相关内容~搜索同义词*取代所有字符.取代一个字符" "双引号 强调OR/|或条件搜索()查询分组 高级语…

C#笔记10 Thread类怎么终止(Abort)和阻止(Join)线程

Thread类 C#笔记8 线程是什么?多线程怎么实现和操作?-CSDN博客 C#笔记9 对线程Thread的万字解读 小小多线程直接拿下!-CSDN博客 上次说过怎么简单的使用多线程,怎么创建多线程,但是没有具体分析它的终止和释放。 线…

【乐吾乐大屏可视化组态编辑器】使用手册

1 总览 开始设计:大屏可视化设计器 - 乐吾乐Le5le 1.1 画布 画布即绘画区域,将图形拖拽到画布进行编辑,绘制大屏。 1.2 菜单栏 顶部菜单导航,一级菜单可设置Logo、公司名称、文件编辑、常用编辑、查看、帮助,设置大…

text2sql(NL2Sql)综述《The Dawn of Natural Language to SQL: Are We Fully Ready?》

《The Dawn of Natural Language to SQL: Are We Fully Ready?》(github)出自2024年6月的NL2SQL(Natural language to SQL )综述论文。这篇论文尝试回答如下三个问题: 问题1:NL2SQL的现状是什么?(Q1:Where Are we Now?) 论文图1总结了近20年NL2SQL方法…