【JVM】垃圾回收算法与分代回收

news2025/2/26 18:12:33

文章目录

  • 1. 垃圾回收算法概述
  • 2. 标记-清除算法
  • 3. 标记-复制算法
  • 4. 标记-整理算法
  • 5. 分代回收

本文参考:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)

1. 垃圾回收算法概述

根据判定对象消亡的角度来看,垃圾收集算法可分为

  1. 引用计数式垃圾收集(直接垃圾收集)
  2. 追踪式垃圾收集(间接垃圾收集)

Java虚拟机中采用的是追踪式垃圾收集,追踪式垃圾收集有

  1. 标记-清除算法
  2. 标记-复制算法

2. 标记-清除算法

该算法是最基础的收集算法,分给标记和清除两个阶段。

image-20230129132943477

  1. 标记:标记出所有需要回收的对象
  2. 清除:在标记完成后,统一回收所有被标记的对象

反过来也可以,标记存活的对象,在标记完成后,清除未被标记的对象。

这里的标记,是根据可达性分析进行标记的,标记的是可达性分析算法中不可达(可达)的对象。

image-20230129131516319

标记-清除算法的缺点

  1. 执行效率不稳定。如果大部分对象都需要被回收,那么就需要进行大量标记和清除的动作,导致标记和清除两个过程的执行效率都随对象数量增长而降低。
  2. 内存空间的碎片化问题。标记、清除之后会产生大量不连续的内存碎片,内存碎片会导致需要分配大对象时无法找到连续的内存而不得不触发另一次垃圾收集动作。

3. 标记-复制算法

标记-复制算法是为了解决面对大量可回收对象时的执行效率低的问题。

该算法的思路就是

  1. 将可用内存按容量划分为大小相等的两块。每次只用其中一块。
  2. 当这一块内存用完时,就将还存活的对象复制到另一块上面。
  3. 然后把已经使用过的内存一次清理掉

image-20230129132535082

如果内存中大量对象是存活的,那么这种算法就会产生大量的内存复制的开销。

虽然说这种算法实现起来简单、运行高效,但是也存在缺点

  1. 将可用内存缩小为原来的一半,空间浪费严重。

而优点却是不会有内存碎片。

image-20230129132918262


4. 标记-整理算法

标记-复制算法在对象存活率高的情况下需要进行较多的复制操作,效率会降低。

并且会浪费一半内存,如果不想浪费内存还需要额外的空间进行分配担保,所以老年代一般不能直接选用这种算法。

标记-整理算法与标记-复制算法不同的是在标记后续的步骤不再是直接对回收对象清除,然后将所有存活对象都向内存空间一端移动,然后清除掉边界外的内存。

image-20230129133517688

移动存活对象,尤其是老年代这种每次回收都有大量对象存活的区域,移动存活对象并更新所有引用这些对象的地址将是一种负重操作,并且在对象移动操作的时候必须全程暂停用户应用程序才能进行,也就是Stop The World

image-20230129134009031


5. 分代回收

分代收集理论建立在两个假说之上

  1. 弱分代假说:绝大多数对象都是朝生夕灭的
  2. 强分代假说:熬过越多次垃圾收集过程的对象就越难以消亡。
  3. 跨代引用假说:跨代引用相对于同代引用来说仅占极少数。
    1. 存在相互引用关系的两个对象,它们应该是同生共死的,由于老年代的对象难以消亡,那么新生代的对象也得以生存,随着年龄增长,新生代对象就会晋升到老年代,跨代引用也就消除了。

Java堆划分为新生代和老年代两个区域。

  1. 新生代:新生代的绝大多数对象都是朝生夕灭的,每次回收只需要关注如何保存少量存活的对象,而不是去标记那些大量将要回收的对象,就能以较低代价回收到大量空间。
  2. 老年代:老年代的绝大多数对象为难以消亡的对象,虚拟机便可以使用较低的频率来回收这些区域。

image-20230129135908714

分代回收流程

  1. 对象首先分配在伊甸园(Eden Space
  2. 新生代空间不足时,触发 minor gc,伊甸园和 from 存活的对象使用 copy 复制到 to 中,存活的对象年龄加1并且交换 from和to 的指向
  3. minor gc 会引发 stop the world,暂停其它用户的线程,等垃圾回收结束,用户线程才恢复运行 当对象寿命超过阈值时,会晋升至老年代,最大寿命是15(4bit
  4. 当老年代空间不足,会先尝试触发 minor gc,如果之后空间仍不足,那么触发 full gcSTW的时 间更长

几种收集的定义

  1. 部分收集(Partial GC):指目标不是完整收集整个Java堆的垃圾收集。
    1. 新生代收集(Minor GC/Young GC):指目标只是新生代的垃圾收集。
    2. 老年代收集(Major GC/Old GC):指目标只是老年代的垃圾收集。
    3. 混合收集(Mixed GC):指目标是收集整个新生代以及部分老年代的垃圾收集。目前只有G1收集器会有这种行为。
  2. 整堆收集(Full GC):收集整个Java堆和方法去的垃圾收集。

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

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

相关文章

基于PHP的学院社团管理系统

摘 要“互联网”的战略实施后,很多行业的信息化水平都有了很大的提升。但是目前很多学校日常工作仍是通过人工管理的方式进行,需要在各个岗位投入大量的人力进行很多重复性工作,这样就浪费了许多的人力物力,工作效率较低&#xff…

Python爬虫4-Scrapy爬虫框架入门了解

目录1、Scrapy爬虫框架介绍1.1 requests库和Scarpy爬虫的比较1.2 Scrapy爬虫的常用命令2、Scrapy爬虫基本使用2.1 步骤2.2 yield关键字的使用1、Scrapy爬虫框架介绍 安装Scrapy库:pip install scrapy 爬虫框架:是实现爬虫功能的一个软件结构和功能组件集…

手动挂载apex镜像

手动挂载apex镜像 1.loop设备 在类 UNIX 系统里,loop 设备是一种伪设备(pseudo-device),或者也可以说是仿真设备。它能使我们像块设备一样访问一个文件。 这要先从mount的流程来理解,挂载操作,实际上就是把设备上的文件系统/目…

【MyBatis】核心配置文件,三大对象的作用域,#{}和${}的区别

1. environment环境:一般一个环境environment会对应一个SqlSessionFactory对象sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"),"另一个环境的id");// 数据库环境配置在这个标签里 // 这里的default表示默认使用的环…

Spring Security 源码解读 :基本架构及初始化

Spring Security 是基于web的安全组件,所以一些相关类会分散在 spring-security包和web包中。Spring Security通过自定义Servlet的Filter的方式实现,具体架构可参考官网Spring Security: Architecture 这里使用Spring Boot 2.7.4版本,对应Sp…

安某客滑块分析

本文仅供学习,不参与商业应用 目标连接: aHR0cHM6Ly93d3cuYW5qdWtlLmNvbS9jYXB0Y2hhLXZlcmlmeS8/Y2FsbGJhY2s9c2hpZWxkJmZyb209YW50aXNwYW0 接口分析 刷新链接可以看到getInfoTp的接口,请求参数sessionId及dInfo是加密参数 返回的参数包含…

Cesium 生成terrain地形数据

Cesium 生成terrain地形数据 处理地形数据 由于CTB工具不支持DEM为NoData值和float的数据,所以需要对数据进行处理。 多个tif必须县合并镶嵌成一张tifpixeltype从float转为intNoData值处理为0我使用的是ArcGis10.5,打开ArcMap: 打开 ArcToolbox->Data Management Tools…

C语言基础知识(55)

C语言程序在不使用数组的情况下找到“N”个数字中的最大数字参考以下代码实现&#xff1a;#include<stdio.h>intmain(){int count 0;int numb1 0;int numb2 0;int i 0;printf("Enter count of numbers ");scanf("%d",&count);if(count <0){p…

HTTP绕WAF之浅尝辄止

0X00前言 最近参加重保&#xff0c;和同事闲聊时间&#xff0c;谈起来了外网&#xff0c;彼时信心满满&#xff0c;好歹我也是学了几年&#xff0c;会不少的。结果&#xff0c;扭头看完do9gy师傅的《腾讯 WAF 挑战赛回忆录》&#xff0c;就啪啪打脸了。说来惭愧&#xff0c;最…

【数据结构(5)】2.3 线性表的类型定义

文章目录1. 线性表的抽象数据类型定义2. 线性表的基本操作1. 线性表的抽象数据类型定义 数据对象&#xff1a;就是一些元素&#xff0c;元素的个数大于等于 0。数据关系&#xff1a;ai-1 是 ai 的前驱&#xff0c;同时 ai 是 ai-1 的后继&#xff0c;他们都属于集合 D 2. 线性…

1月的碎碎念,但是很有必要

从今年开始每个月会整理一个我生活的琐碎但觉得有必要的事&#xff0c;一来方便年底回顾&#xff0c;二来也希望这些事情对大家有也有些参考。 不高大上&#xff0c;但是希望某一天再看到的时候会觉得充满趣味。1.新的1年的1月开始了&#xff0c;想了很多计划&#xff0c;搬新办…

rocketmq源码-consumerQueue和indexFile文件写入

前言 在rocketmq的文件中&#xff0c;除了commitLog文件&#xff0c;还有两个重要的文件&#xff0c;分别是indexFile文件和consumerQueue文件&#xff0c;这篇笔记主要记录这两个文件的数据是怎么写进去的 consumeQueue文件中对应topic下的一个queue&#xff0c;在consumeQue…

ubuntu22.04安装kalibr

前言 首先ros1目前目前在ubuntu支持的最高版本是20.04。当时我是在ubuntu22.04上编译安装的ros1。过程也十分坎坷&#xff0c;手动下载了很多包&#xff0c;具体就不累赘了。 再者目前网上的资料也都是kalibrros1, 所以推荐安装ros1之后再来安装kalibr。其次这次安装主要 参考…

关于splitChunks的一次原理探索

前言 前端时间在做项目加载优化时用到了splitChunks自动拆包&#xff0c;后了解了一下原理写下了此文。 Modules和Chunks Modules简单来理解就是我们写的功能模块&#xff0c;不管是CommonJS还是ESM都算是一个Module&#xff0c;而Chunks则是webpack根据我们的规则/默认规则…

spring security 前后端分离 进行用户验证 权限登陆的实现代码(看不懂??直接cv)

目录 前言&#xff1a; 一.所需依赖 二.application.properties 三.工具类 3.1ApplicationContextUtils 3.2JwtUtils 3.3ResponseResult 3.4ResponseStatus 3.5RsaUtils 四.UserDetailServiceImpl 五.成功处理器 六.SecurityConfig 七. filter 前言&#xff1a; 前后…

多个路由器的局域网终端设备的资源访问

多个路由器之间资源的访问 本质是将路由设备放置到一个网段 中继路由 中继的路由可以看作是另一个路由中的一个终端设备&#xff0c;只是为了延长传递wifi&#xff0c;在使用ipcofig中的网关和主路由的网关一样&#xff0c;一般都是主路由的IP。 无线桥接的中继路由 无论是…

车-电-路网时空分布负荷预测研究(Matlab代码)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

使用c语言连接mysql数据库并且批量插入数据

​ 使用从c连接数据库需要在本机安装数据库&#xff0c;或者拿到数据库所在主机的IP地址。先说明我使用的是mysql8.0 64位的数据库&#xff0c;使用的vs是vs2019。 1.配置环境 首先打开vs2019&#xff0c;创建一个空项目&#xff0c;让后右击下图所示位置&#xff0c;然…

网络编程套接字之UDP

文章目录一、网络编程二、UDP数据报套接字编程DatagramSocketDatagramPacket实现客户端服务器程序EchoServer客户端一、网络编程 我们网络编程的核心: Socket API&#xff0c;操作系统为我们应用程序提供的API&#xff0c;我们的Socket是和传输层密切相关的。 我们传输层为我…

SpringBoot+Vue+Wx健康上报系统

简介&#xff1a;本项目采用了基本的springbootvueWx设计健康上报系统。详情请看截图。经测试&#xff0c;本项目正常运行。本项目适用于Java毕业设计、课程设计学习参考等用途。 项目描述 项目名称SpringBootVueWx健康上报系统源码作者LHL项目类型Java EE项目 &#xff08;前…