当前位置: 首页 > news >正文

GC常见垃圾回收算法,JVM分代模型

如何判断是垃圾?引用计数器和Root可达性算法

如何进行清除?标记清除、复制、标记整理

堆分代模型?Eden,Surevivor,Tenuring

一个对象从创建到消亡的过程?

对象什么时候进入老年代?

一、GC(Garbage Collector)

GC tuning:GC调优

tuning:调整,调优

reference:引用

1、Garbage,什么是垃圾?

没有引用指向的任何对象,都是Garbage

2、判断什么是垃圾的两种算法(也就是怎么找到垃圾):

(1)reference count(引用计数器):

有一个对象引用该变量,在对象头+1,有多个就加多个,没引用了就-1,减到0,说明没有引用了,判定为垃圾;

reference  count不能解决的问题是循环引用问题,比如对象A引用对象B,对象B引用对象C,对象C又引用对象A;

相互引用的时候没有任何第三方对象引用这两个对象,不能判断为垃圾,不会被回收,实际上是需要被回收的:

(2)root searching(可达性算法):

在编程过程中哪些对象或者变量会被定义成root?

JVM Stack:虚拟机栈里面的线程栈里面的变量;

Native Stack:c/c++实现的那些native方法里面使用到的变量,会被定义为root对象

静态变量:static修饰的对象

常量池里面的对象:比如Class对象

一般是一个程序启动后马上要用到的对象;

3、找到垃圾之后,如何进行清除?

三种算法:(优缺点是指这种算法的优缺点)

(1)Mark Sweep:标记清除,

特点:

  • 从Root对象开始,遍历两次,一次进行标记,一次进行清除;
  • 算法简单;执行效率不稳定,垃圾较多,而存活对象少的时候,效率低,内存空间碎片化会更严重;

(2)为解决Mark Sweep算法的缺陷,提出:Semispace Copying:拷贝(半区复制算法)

实现:

  • 将内存一份为二,从Root对象开始,将有用的对象移动(复制)到一边,移动完成后清除另一边需要被回收的内存;当垃圾较多,存活对象较少时,只需要将存活对象移动到一块很小的区域,就能进行垃圾清除,效率高,同时也能解决内存空间碎片化的问题;
  • 只扫描一次,但移动复制对象,需要调整对象的引用,会产生对象引用指针移动的开销,同时将内存一分为二,也会造成内存减半的后果,空间浪费;
  • 如果存活对象比较多的情况下不适合;
  • 如果存活对象比较多,内存又减半会导致内存不足,需要老年代进行分配担保(当Eden进行回收后往Surivor区进行复制,Surivor区发现内存不足,对象直接进入老年代)

(3)Mark Compact:标记整理

实现及特点:

  • 扫描2次,从Root开始将有用的对象压缩到内存的头部,如果前面有垃圾进行填充
  • 需要移动对象,效率偏低;
  • 不会产生内存碎片,更方便对象分配,不会产生内存减半;

总结:标记清除和标记整理的算法

  • 是否移动对象:移动则回收的时候更复杂,不移动则内存再分配时会更复杂
  • 是否停顿(或者说停顿时间更短):移动的时候停顿时间更长,不移动的时候停顿时间短,甚至可以不停顿;
  • 吞吐量:从吞吐量的角度考虑,移动对象吞吐量会更高;
  • 也就是说,根据业务,如果在意用户体验,不要停顿太长时间的情况下,考虑使用不移动对象的垃圾回收算法,也就是标记-清除
  • 如果对吞吐量要求高的场景,使用移动对象的垃圾回收算法,也就是复制或者标记整理的垃圾回收算法会更划算;

二、JVM内存分代模型

1、堆内存的逻辑分区

G1是逻辑分代,但物理内存不分代,除此之外,都是逻辑分代,物理内存也分代

Eden区是new出来的对象真正存放的区域,而S0和S1是经过回收会还存活的对象存在区域

GC算法的选择上,新生代活着的对象比较少适合Copying算法的垃圾回收器,而老年代 ,存活的对象比较多,适合Mark Sweep(MS)和Mark Compact(MC)这两种算法实现的垃圾回收器;

查询年轻代和老年代之间的空间比值:NewRatio=2,意思是年轻代和老年代的比值是1:2:

java查询参数小细节:java  -XX:PrintFlagsFianl  -version  

以-开头的标准参数

以-X开头是非标准参数,

以-XX开头,不稳定参数,有些版本支持,有些版本可能不支持,也可能不是这个命令

2、一个对象从创建到消亡的过程:

先尝试栈上分配,如果满了,在Eden区分配,当出现GC时,会往S0区域移动,多次回收是指在S0和S1上来回移动,移动次数可以通过参数配置,经过多次回收还存活,移动到老年代;

MinorGC/YGC:  年轻代垃圾回收,年轻代空间耗尽,无法再分配空间时,触发该GC;

Major/FullGC:  老年代和年轻代都空间耗尽,无法再分配空间时,老年代和年轻代都会触发GC;

3、对象尝试在栈上分配

(1)什么样的内容会在栈上分配?

  • 线程私有小对象:对象比较小,而且是线程私有的,没有线程共享
  • 无逃逸:出了线程无其他线程知道这个对象的存在
  • 支持标量替换:对象只有少量属性,完全可以使用这些属性来替换对象;

(2)当线程栈上分配空间不足了,会进行线程本地分配(Thread Local Allocation Buffer,简称TLAB)

  • 每个线程会在Eden区有一块小区域是该线程独享的,用于分配小对象,仅1%;
  • 多线程的时候不用竞争Eden区域就可以申请的空间,可以提升对象分配的效率;

4、对象什么时候进入老年代?以下两种情况会进入老年代

(1)通过一个参数设置:XX:MaxTenuringThreshold指定回收次数,也就是当进行GC时,对象在S0和S1之间进行copying,超过该参数设置的值,就会触发对象进入老年代;

该参数,在

Paralle Scavenge中默认是15

CMS:6

G1:15

(2)动态年龄,是指将S0里面的存活对象全部拷贝到S1的时候,如果发现全部对象的大小超过了S1的空间的50%,则会触发动态年龄淘汰机制,就是把年龄最大的那些对象放入老年代,而不管他的copying次数是否超过设置的阈值;

相关文章:

GC常见垃圾回收算法,JVM分代模型

如何判断是垃圾?引用计数器和Root可达性算法 如何进行清除?标记清除、复制、标记整理 堆分代模型?Eden,Surevivor,Tenuring 一个对象从创建到消亡的过程? 对象什么时候进入老年代? 一、GC&a…...

面试题整理(三)

芯冰乐知识星球入口:...

可视化建模以及UML期末复习----做题篇

一、单项选择题。(20小题,每小题2分,共40分) 1、UML图不包括( ) A、用例图 B、状态机图 C、流程图 D、类图 E、通信图 答案:C、流程图 UML中不包括传统意义上的流程图,流程图通常是指B…...

PostGIS分区表学习相关

在Postgresql中对空间数据进行表分区的实践_postgresql空间数据-CSDN博客文章浏览阅读1.4k次,点赞26次,收藏21次。Postgresql的分区功能允许将一个大表按照特定的规则拆分成多个小的分区表。这样做的好处在于,在查询数据时,可以只…...

JavaEE 【知识改变命运】03 多线程(3)

文章目录 多线程带来的风险-线程安全线程不安全的举例分析产出线程安全的原因:1.线程是抢占式的2. 多线程修改同一个变量(程序的要求)3. 原子性4. 内存可见性5. 指令重排序 总结线程安全问题产生的原因解决线程安全问题1. synchronized关键字…...

Flash操作 原子写 非原子写

原子和非原子操作 读、修改、写操作 对一个变量 A 1或上0x01,C语言写法: A 1| 0x01; 通过编译转成汇编后: LOAD R1,[#A 1] ; Read a value from A 1 into R1 MOVE R2,#0x01 ; Move the absolute constant 1 into R2 OR R1,R2 ; Bitwise O…...

厦门凯酷全科技有限公司怎么样?

随着短视频和直播带货的兴起,抖音电商平台迅速崛起,成为众多品牌和商家争夺的新战场。在这个竞争激烈的市场中,如何抓住机遇、实现销售增长,成为了每个企业面临的挑战。厦门凯酷全科技有限公司(以下简称“凯酷全”&…...

ubuntu 18.04设置命令行历史记录并同时显示执行命令的时间

以下相关详细信息请参考ubuntu官网。 在Ubuntu 18.04中,查看特定用户(例如用户broko)的命令行历史记录,并同时显示执行命令的时间,可以通过修改用户的shell配置文件来实现: • 设置HISTTIMEFORMAT环境变量…...

推荐系统里面的多任务学习概述

1. 概述 多任务学习(multi-task learning),本质上是希望使用一个模型完成多个任务的建模,在推荐系统中,多任务学习一般即指多目标学习(multi-label learning),不同目标输入相同的fe…...

解决uview ui赋值后表单无法通过验证

微信小程序中 主要还是文档有这样一段话://如果需要兼容微信小程序,并且校验规则中含有方法等,只能通过setRules方法设置规则。 添加即可通过 onReady() {//如果需要兼容微信小程序,并且校验规则中含有方法等,只能通过…...

【GL010】C/C++总结(二)

C部分 1. C中类成员的访问权限 无论成员被声明为 public、protected 还是 private,都是可以互相访问的,没有访问权限的限制。在类的外部 (定义类的代码之外),只能通过对象访问成员,并且通过对象只能访问 p…...

【合作原创】使用Termux搭建可以使用的生产力环境(五)

前言 在上一篇【合作原创】使用Termux搭建可以使用的生产力环境(四)-CSDN博客我们讲到了如何让proot-distro中的Debian声音驱动正常,将我们的系统备份后,通过VNC客户端连接到VNC服务器,这一篇我们来讲一下xfce桌面的美…...

初始数据结构

程序数据结构算法 数据结构研究计算机数据(元素)间关系 包括数据的逻辑结构和存储结构及其(数据间)操作 一、基本概念 1.1数据 数据即信息的载体,能被输入到计算机中并且能被它识别、存储和处理的符号总称 1.2数据…...

给我的小程序加了个丝滑的搜索功能,踩坑表情包长度问题

前言 最近在用自己的卡盒小程序的时候,发现卡片越来越多,有时候要找到某一张来看看笔记要找半天,于是自己做了一个搜索功能,先看效果: 怎么样,是不是还挺不错的,那么这篇文章就讲讲这样一个搜索…...

MATLAB中的合并分类数组

目录 创建分类数组 串联分类数组 创建具有不同类别的分类数组 串联具有不同类别的数组 分类数组的并集 此示例演示了如何合并两个分类数组。 创建分类数组 创建分类数组 A,其中包含教室 A 中的 25 个学生的首选午餐饮料。 rng(default) A randi(3,[25,1]); …...

ShardingSphere-JDBC

1. 什么是分库分表? 分库分表是一种数据库扩展技术,通过将数据拆分到多个数据库(分库)或多个表(分表)中来解决单一数据库或表带来的性能瓶颈。分库分表可以有效提升系统的可扩展性、性能和高并发处理能力&…...

企业如何选择远程控制软件来远程IT运维?

在当今企业的日常运作中,IT运维无疑是核心环节之一,它对于保持企业信息系统的稳定运行和数据安全至关重要。随着科技的快速进步,远程控制软件在IT运维中的应用变得越来越重要。今天,我们就来探讨一下远程控制软件如何助力企业IT运…...

Meta Llama 3.3 70B:性能卓越且成本效益的新选择

Meta Llama 3.3 70B:性能卓越且成本效益的新选择 引言 在人工智能领域,大型语言模型一直是研究和应用的热点。Meta公司最近发布了其最新的Llama系列模型——Llama 3.3 70B,这是一个具有70亿参数的生成式AI模型,它在性能上与4050…...

【银河麒麟高级服务器操作系统】修改容器中journal服务日志存储位置无效—分析及解决方案

了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer.kylinos.cn 文档中心:https://documentkylinos.cn 服务器环境以及配置 【机型】 整机类型/架构&am…...

go语言zero框架对接阿里云消息队列MQ的rabbit的配置与调用

在 Go 语言中对接阿里云消息队列(MQ)的 RabbitMQ 配置与调用,首先需要安装和配置相关的 Go 库,并了解如何通过 RabbitMQ 与阿里云消息队列进行交互。 ### 步骤一:安装 RabbitMQ Go 客户端库 阿里云的消息队列&#x…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

Kafka入门-生产者

生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键&#xff…...

DAY 26 函数专题1

函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...

客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践

01技术背景与业务挑战 某短视频点播企业深耕国内用户市场,但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大,传统架构已较难满足当前企业发展的需求,企业面临着三重挑战: ① 业务:国内用户访问海外服…...

Linux-进程间的通信

1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...

EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势

一、WebRTC与智能硬件整合趋势​ 随着物联网和实时通信需求的爆发式增长,WebRTC作为开源实时通信技术,为浏览器与移动应用提供免插件的音视频通信能力,在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能,对实时…...