JVM 垃圾回收分配及算法

一、判断对象是否可以回收

垃圾收集器在做垃圾回收的时候,首先需要判定的就是哪些内存是需要被回收 的,哪些对象是「存活」的,是不可以被回收的;哪些对象已经「死掉」了,需 要被回收。 一般有两种方法来判断:

        引用计数器法:为每个对象创建一个引用计数,有对象引用时计数器 +1,引用被释放时计数 -1,当计数器为 0 时就可以被回收。它有一个缺点不能解决循环引用的问题

        可达性分析算法:从 GC Roots 开始向下搜索,搜索所走过的路径称为引用链。 当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是可以被回收的。

二、堆空间分配年轻代老年代及对应回收算法

堆主要用于存放各种类的实例对象和数组。在java中被分为两个区域:年轻代和老年代。 

年轻代和老年代的划分是为了更好的内存分派及回收。提高效率。堆是垃圾回收机制的重点区域。我们知道垃圾回收机制有三种,minor gc,major gc 和full gc。针对于堆的就是前两种。年轻代的叫 minor gc,老年代的叫major gc。 

1. 年轻代

年轻代中存在的对象是死亡非常快的,存在朝生夕死的情况。尺寸随堆大小的增加和减少而相应的变化,默认值是保持为堆的1/15。所以为了提高年轻代的垃圾回收效率,又将年轻代划分为三个区域: Eden区SurvivorFrom区SurvivorTo区

eden和survivor默认比例是8:1:1,进行垃圾回收采用的是分代复制算法(优点是避免内存碎片新创建的对象都会被分配到Eden区(如果该对象占用内存非常大,则直接分配到老年代区),当Eden区内存不够的时候就会触发MinorGC(Survivor满不会引发MinorGC,而是将对象移动到老年代中), 每次新生代的使用,会是eden区和一块survivor区。当我们进行垃圾回收的时候,清除正在使用的区域,将其中的存货对象,放入到另一个survivor区域并进行整理,保证空间的连续如果对象长时间存活,则将对象移动到老年区。“From”区和“To”区互换角色,原Survivor To成为下一次GC时的Survivor From区, 总之,GC后,都会保证Survivor To区是空的。存活下来的对象,他的年龄会增长1。当对象的年龄一次次存活,一次次增长,到达15的时候,这些对象就会移步到老年代。在年轻代执行gc的时候,如果老年代的连续空间小于新生代对象的总大小,就会触发一次full gc。是为了给新生代做担保,保证新生代的老年对象可以顺利的进入到老年代的内存区。

2. 老年代

随着Minor GC的持续进行,老年代中对象(年龄大于15的对象)也会持续增长,导致老年代的空间也会不够用,最终会执行Major GC(或full gc)(MajorGC 的速度比 Minor GC 慢很多很多,据说10倍左右),full gc会包含年轻代的gc。但老年代只要执行gc就一定是full gc。full gc使用的算法是:标记清除(回收)算法或标记压缩算法

标记无用对象,然后进行清除回收。 标记-清除算法(Mark-Sweep)是一种常见的基础垃圾收集算法,当进行标记清除时,会停止整个程序(stop the world),它将垃圾收集分为两个阶段:

        标记阶段:从根节点开始遍历,标记所有被引用的对象,一般在对象的header中标记为可达对象。

        清除阶段:collector对堆内存从头到尾进行线性遍历,如果发现某个对象的header没有标记为可达对象,则回收 。这里的回收是把对象的地址保存在空闲的地址列表中(内存分配),下次对象需要加载时,判断垃圾的位置空间是否够,如果够就存放覆盖原有的地址。

优点:实现简单,不需要对象进行移动。

缺点:标记、清除过程效率低,产生大量不连续的内存碎片,提高了垃圾回收的频率。 

3. 永久代(元空间)

在Java8中,永久代已经被移除,被一个称为“元数据区”(元空间,Metaspace)的区域所取代。
值得注意的是:元空间并不在虚拟机中,而是使用本地内存(之前,永久代是在jvm中)。这样,解决了以前永久代的OOM问题,元数据和class对象存在永久代中,容易出现性能问题和内存溢出,毕竟是和老年代共享堆空间。java8后,永久代升级为元空间独立后,也降低了老年代GC的复杂度。

元空间也是对java虚拟机的方法区的一种实现。元空间与永久代最大的区别在于,元空间不在虚拟机中,使用本地内存。通过配置如下参数可以更改元空间的大小。
        -XX:MetaspaceSize:初始空间的大小。达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。
        -XX:MaxMetaspaceSize,最大空间,默认是没有限制的。
永久代的回收会随着full gc进行移动,消耗性能。每种类型的垃圾回收都需要特殊处理元数据。将元数据剥离出来,简化了垃圾收集,提高了效率。

三、其他垃圾回收算法

1. 复制算法(年轻代使用)

为了解决标记-清除算法的效率不高的问题,产生了复制算法。它把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾收集时,遍历当前使用的区域,把存活对象复制到另外一个区域中,最后将当前使用的区域的可回收的对象进行回收。

优点:按顺序分配内存即可,实现简单、运行高效,不用考虑内存碎片。

缺点:可用的内存大小缩小为原来的一半,对象存活率高时会频繁进行复制。

2. 标记-整理算法(标记压缩算法

在新生代中可以使用复制算法,但是在老年代就不能选择复制算法了,因为老年代的对象存活率会较高,这样会有较多的复制操作,导致效率变低。标记-清除算法可以应用在老年代中,但是它效率不高,在内存回收后容易产生大量内存碎 片。因此就出现了一种标记-整理算法(Mark-Compact)算法,与标记-清除算法不同的是,在标记可回收的对象后将所有存活的对象压缩到内存的一端,使他们紧凑的排列在一起,然后对端边界以外的内存进行回收。回收后,已用和未用的内存都各自一边。

优点:解决了标记-清理算法存在的内存碎片问题。

缺点:仍需要进行局部对象移动,一定程度上降低了效率。

参考:

JVM年轻代,老年代,永久代详解 - 经典鸡翅 - 博客园 (cnblogs.com)

jvm之年轻代(新生代)、老年代、永久代以及GC原理详解_老年代空间多大-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mysql数据库切换成kingbase(人大金仓)数据库时遇到的字段不存在问题

一、问题描述 mysql数据库切换成国产数据库人大金仓(kingbase)数据库的遇到的字段不存在的问题,根本原因其实是没有找到相对应的表,报错示例如下图所示: 二、问题解决 1、如果所有的表都发生上述的错误,kingbase的表在xml里面写sql的时候需要带上空间名的前缀,比如pu…

《Linux运维总结:prometheus+altermanager+webhook-dingtalk配置文件详解》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、prometheus配置文件 Prometheus的配置文件是prometheus.yml,在启动时指定相关的…

09-axios在Vue中的导入与配置

09-axios 前言首先简单了解什么是Axios?以上完成后就可以使用了 前言 我们接着上一篇文章 08-路由地址的数据获取 来讲。 下一篇文章 10-vuex在Vue中的导入与配置 首先简单了解什么是Axios? Axios是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端…

D触发器(D Flip-Flop)与D锁存器(D Latch)

1 基础概念 我们先来简单回顾一下D触发器(D flip-flop)和D锁存器(D latch)的概念,以及它们在数字电路中的作用。 1.1 D触发器(D Flip-Flop) D触发器是一种数字存储器件,它在时钟信号…

VBA学习(16):工作表事件示例:输入数据后锁定单元格

在工作表单元格中输入数据后,该单元格就被锁定,不能再编辑。 打开VBE,在工程资源管理器中双击该工作表名称打开其代码模块,在其中输入下面的代码: 假设整个工作表的LockedFalse Private Sub Worksheet_Change(ByVal …

超大cvs文件导入MySQL

1 XXX.cvs 太大 使用cvs拆分HugeCSVSplitter_jb51工具进行拆分,Line Count 设置为1,000,000 注意:1 拆分后除第一个子cvs文件含有标题外,其他的子文档都不含有标题行; 2 后一个文档的第一行为前一个文档的…

【尚庭公寓SpringBoot + Vue 项目实战】用户管理(十五)

【尚庭公寓SpringBoot Vue 项目实战】用户管理(十五) 文章目录 【尚庭公寓SpringBoot Vue 项目实战】用户管理(十五)1、业务介绍2、接口实现2.1、根据条件分页查询用户列表2.2、根据ID更新用户状态 1、业务介绍 用户管理共包含两…

数据结构与算法-B(B-)树的简单实现

B(B-)树定义 B树(或B-tree)是一个在计算机科学中广泛使用的数据结构,它是一种自平衡的树,能够保持数据有序。 以下是B树的特性 每个节点最多右m个孩子,二叉树是B-树的特例,其有2个孩子。除了叶节点和根节点…

【Gradio】从 BigQuery 数据创建实时仪表板

Google BigQuery 是一个基于云的服务,用于处理非常大的数据集。它是一个无服务器且高度可扩展的数据仓库解决方案,使用户能够使用类 SQL 查询分析数据。 在本教程中,我们将向您展示如何在 Python 中查询 BigQuery 数据集,并使用 g…

IntelliJ IDE 插件开发 | (十)主题插件开发入门

系列文章 本系列文章已收录到专栏,交流群号:689220994,也可点击链接加入。 前言 在前面的章节中,我们介绍的都是功能性插件的开发内容,本文则会介绍一下主题类插件的开发方式。不过本文也只是带大家入个门&#xff…

书生·浦语大模型LagentAgentLego智能体应用搭建 第二期

文章目录 智能体概述智能体的定义智能体组成智能体范式 环境配置Lagent:轻量级智能体框架实战Lagent Web Demo用 Lagent 自定义工具 AgentLego:组装智能体“乐高”直接使用AgentLego作为智能体工具使用 用 AgentLego 自定义工具 智能体概述 智能体的定义…

aardio - 【库】lock 跨进程读写锁

import win.ui; /*DSG{{*/ var winform win.form(text"aardio form";right272;bottom203;topmost1) winform.add( button{cls"button";text"无锁演示";left27;top132;right120;bottom184;z2}; button2{cls"button";text"有锁演示…

邀请函 | 人大金仓邀您相聚第十三届中国国际国防电子展览会

盛夏六月 备受瞩目的 第十三届中国国际国防电子展览会 将于6月26日至28日 在北京国家会议中心盛大举办 作为数据库领域国家队 人大金仓 将携系列行业解决方案 和创新实践成果亮相 期待您莅临指导 ↓↓↓↓↓↓ CIDEX 2024 中国国际国防电子展览会(简称CIDEX&#xf…

Linux环境搭建之CentOS7(包含静态IP配置)

🔥 本文由 程序喵正在路上 原创,CSDN首发! 💖 系列专栏:虚拟机 🌠 首发时间:2024年6月22日 🦋 欢迎关注🖱点赞👍收藏🌟留言🐾 安装VMw…

在scrapy中使用Selector提取数据

经院吉吉: 首先说明一下,在scrapy中使用选择器是基于Selector这个对象滴,selector对象在scrapy中通过XPATH或是CSS来提取数据的,我们可以自己创建selector对象,但在实际开发中我们不需要这样做,因为respons…

【Linux系统】多线程

本篇博客继上一篇《线程与线程控制》,又整理了多线程相关的线程安全问题、互斥与锁、同步与条件变量、生产消费模型、线程池等内容,旨在让读者更加深刻地理解线程和初步掌握多线程编程。(欲知线程的相关概念、线程控制的相关接口等&#xff0…

基于SpringBoot+协同过滤算法的家政服务平台设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,…

小米红米全机型TWRP下载刷入教程-获取root权限--支持小米14/红米K7Pro/红米Turbo3等机型

刷机注意: 本教程为小米红米全机型专用TWRP_Recovery合集,ROM乐园独家首发整理。请确保你的电脑能正确连接你的手机,小米红米手机需要解锁BL,请参照下面教程 小米MIUI澎湃OS解锁BL教程:小米手机官方解锁BootLoader图文…

Python发送Email的性能怎么样?如何配置?

Python发送Email怎么配置SMTP?批发邮件的方法技巧? Python是一种广泛使用的编程语言,因其简洁和强大的功能深受开发者喜爱。在许多应用场景中,Python发送Email是一个常见需求。那么,Python发送Email的性能怎么样呢&am…

【SpringBoot】Spring Boot 中高级特性详解

文章目录 1. 异步处理1.1 什么是异步处理?1.2 实现异步处理1.2.1 启用异步支持1.2.2 使用 Async 注解1.2.3 调用异步方法 2. 安全管理2.1 Spring Security 集成2.2 基础安全配置2.2.1 添加依赖2.2.2 默认配置2.2.3 自定义用户认证 3. 监控和调试3.1 Spring Boot Act…