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博客

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

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

相关文章

网络安全攻防基础入门笔记--操作系统名词解释文件下载反弹shell防火墙绕过

渗透测试常用专业术语 POC,EXP,Payload,Shellcode POC 全程Proof of Concept,中文"概念验证",常指一段漏洞证明的代码 EXP 全程Exploit ,中文"利用",指利用系统漏洞进行攻击的动作 Payload 中文"有效载荷",指成功Exploit之后,真正在目标系…

web前端何去何从:探索未来之路

web前端何去何从:探索未来之路 在数字化浪潮的推动下,web前端技术正经历着前所未有的变革。随着新技术的不断涌现和用户体验的持续提升,web前端开发者们面临着前所未有的挑战与机遇。那么,web前端究竟何去何从?本文将…

【SpringBoot系列】覆盖重写第三方Jar包中类

要覆盖或重写一个第三方JAR包中的类,你可以使用以下几种方法: 方法一:使用类路径优先级 Java的类加载机制会优先加载类路径(classpath)中最先找到的类。因此,如果你在自己的项目中定义了一个与第三方JAR包…

Elasticsearch 认证模拟题 - 21

一、题目 写一个查询,要求查询 kibana_sample_data_ecommerce 索引,且 day_of_week、customer_gender、currency、type 这 4 个字段中至少两个以上。 1.1 考点 Boolean 1.2 答案 GET kibana_sample_data_ecommerce/_search {"query": {&q…

金融数据中心布线运维管理解决方案

金融行业的核心业务,如交易、支付、结算等,对网络的依赖程度极高。布线作为网络基础设施的重要组成部分,其稳定性和可靠性直接关系到业务的连续运行。因此,良好的布线管理能够确保网络系统的稳定运行,减少因网络故障导…

SQLserver前五讲课堂笔记

第一讲 基本内容 为什么要学习数据库系统?什么是数据库?什么是数据库系统?什么是数据库管理系统?本课程学什么以及学到什么程度? 重点难点 一组概念的区分:数据库、数据库系统和数据库管理系统熟悉表 的相关要素及术语熟悉数据库系统的构成(工作…

荣耀笔记本IP地址查看方法详解:轻松掌握网络配置技巧

在数字化时代的浪潮中,笔记本电脑已经成为我们生活和工作中不可或缺的重要工具。对于荣耀笔记本用户而言,掌握基本的网络配置技巧显得尤为重要。其中,查看IP地址是连接网络、配置设备、排除故障等场景下的关键步骤。本文将详细介绍荣耀笔记本…

基于单片机的无人监守点滴控制系统设计

摘要 : 在当代社会 , 点滴是一种常用的诊疗方法 。 为了减轻医护人员的压力 , 设计了一种基于单片机的无人监守点滴控制系统, 该系统共由 2 个板子组成 , 其中一个主控板子 , 一个检测板子 。 检测板与…

Flutter全面支持六大平台的开发,那鸿蒙呢?

Hi,大家好,今天带大家了解一下flutter3的新特性,flutter已经实现了对六大平台的支持,flutter进一步进化,对于鸿蒙系统目前没有明确的支持,不过相信不久的将来一定会支持的。 一、futter3的新特性 Flutter 3 在发布后…

部署LVS—DR群集

1、LVS-DR工作流向分析 (1)客户端发送请求到 Director Server(负载均衡器),请求的数据报文(源 IP 是 CIP,目标 IP 是 VIP)到达内核空间。 (2)Director Server 和 Real Se…

【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…

【记录总结】一切都是全新的开始|未来博客规划,专栏整理!

文章目录 1 里程碑2 专栏梳理2.1 已有专栏整理2.2 新开的专栏 1 里程碑 前段时间我也达到了两千粉丝,也成为了CSDN人工智能领域的博客新星,算是一个小小的里程碑吧,所以我决定将自己之前的文章系统梳理,然后同时也进行未来文章的…

missing authentication credentials for REST request

1、报错截图 2、解决办法 将elasticsearch的elasticsearch.yml的 xpack.security.enabled: true 改为 xpack.security.enabled: false

如何在 Windows 上安装 MySQL(保姆级教程2024版)

MySQL 是最流行的数据库管理系统 (DBMS) 之一。它轻量、开源且易于安装和使用,因此对于那些刚开始学习和使用关系数据库的人来说是一个不错的选择。 本文主要系统介绍Windows的环境下MySQL的安装过程和验证过程。 目录 1 安装过程 1.1 前置要求 1.2 下载并安装 …

Java编程避坑指南

在Java编程中,为了编写更高效、可维护的代码,以下是一些重要的闭坑指南: 字符串初始化: 避免使用new String("abc")创建两个字符串对象,应该直接使用"abc"。当创建字符串常量时,如果它…

持续总结中!2024年面试必问 20 道并发编程面试题(七)

上一篇地址:持续总结中!2024年面试必问 20 道并发编程面试题(六)-CSDN博客 十三、请解释什么是生产者-消费者问题。 生产者-消费者问题(Producer-Consumer Problem)是计算机科学和操作系统中的一个经典同…

图解Transformer学习笔记

教程是来自https://github.com/datawhalechina/learn-nlp-with-transformers/blob/main/docs/ 图解Transformer Attention为RNN带来了优点,那么有没有一种神经网络结构直接基于Attention构造,而不再依赖RNN、LSTM或者CNN的结构,这就是Trans…

1.0 Android中Activity的基础知识

一:Activity的定义 Activity是一个应用组件,它提供了一个用户界面,允许用户执行一个单一的、明确的操作,用户看的见的操作都是在activity中执行的。Activity的实现需要在manifest中进行定义,不让会造成程序报错。 1.…

完美的移动端 UI 风格让客户无可挑剔

完美的移动端 UI 风格让客户无可挑剔

JUnit 5学习笔记

JUnit 5 学习笔记 1.JUnit5的改变2.JUnit5常用注解及测试2.1 DisplayName/Disabled/BeforeEach/AfterEach/BeforeAll/AfterAll2.2 Timeout2.3 RepeatedTest 3.断言3.1 简单断言3.2 数组断言3.3 组合断言3.4 异常断言3.5 超时断言3.6 快速失败 4.前置条件5.嵌套测试6.参数化测试…