一次完整的GC流程

news2024/9/29 19:20:54

Java堆中内存区分 

        Java的堆由新生代(Young Generation)和老年代(Old Generation)组成。新生代存放新分配的对象,老年代存放长期存在的对象。
        新生代(Young)由年轻区(Eden)、Survivor区组成(From Survivor、To Survivor)。默认情况下,新生代的Eden区和Survivor区的空间大小比例是8:2,可以通过-XX:SurvivorRatio参数调整。 

一次完整的GC流程

  1. 对象分配

    • 新创建的对象通常首先分配在新生代的Eden区。如果对象体积过大,直接分配到老年代(大对象直接分配)。
  2. Minor GC(新生代垃圾回收)

    • 当Eden区空间不足时,会触发一次Minor GC。这个过程中,Eden区中不再被引用的对象将被回收。
    • 存活下来的对象会被移动到Survivor区的一个(假设为S1),如果S1区也满了,则这些对象和S1中已有的、经历过一次GC的对象一起被移到另一个Survivor区(S2)或者直接晋升到老年代,具体取决于对象的年龄和Survivor区的配置。
    • 每次Minor GC后,对象的年龄增加1,当对象年龄达到预设阈值(默认15)时,该对象会被晋升到老年代。
  3. Survivor区调整

    • Survivor区之间的对象会在几次Minor GC后进行交换,目的是尽可能地利用Survivor空间来保留更多可幸存的对象,减少晋升到老年代的对象数量。
  4. Full GC(老年代垃圾回收)

    • 当老年代空间不足,或者满足其他触发条件(比如元数据空间不足、System.gc()被显式调用等)时,会触发Full GC。
    • Full GC是一个更耗时的过程,因为它涉及整个堆(包括新生代和老年代)以及方法区(元数据区)的垃圾回收。
    • Full GC使用标记-清除、标记-整理(也称为标记-压缩)或其他组合算法来回收空间,这一步可能包括所有存活对象的移动和空间碎片的整理。
  5. 标记过程

    • 不论是Minor GC还是Full GC,都会经历一个标记过程,用来识别哪些对象是可达的(即从GC Roots开始可以访问到的对象)。
    • 这个过程通常包括两个阶段:初始标记和并发标记,后者可以在程序运行时并发执行以减少暂停时间。
  6. 清理与压缩

    • 清理阶段会删除已被标记为不可达的对象。
    • 在某些情况下,特别是Full GC,还会进行压缩操作,移动存活对象以消除碎片,优化内存布局。

 

 

 YoungGC和FullGC的触发条件是什么

        YoungGC的触发条件比较简单,那就是当年轻代中的eden区分配满的时候就会触发。

FullGC的触发条件比较复杂也比较多,主要以下几种:

1. 老年代空间不足创建一个大对象,超过指定阈值会直接保存在老年代当中,如果老年代空间也不足,会触发Full GC。

2.当准备要触发一次YoungGC时,会进行空间分配担保,在担保过程中,发现虚拟机会检查老年  代最大可用的连续空间小于新生代所有对象的总空间,但是HandlePromotionFailure=true,继续检查发现老年代最大可用连续空间小于历次晋升到老年代的对象的平均大小时,会触发一次FullGC


3.永久代空间不足如果有永久代的话,当在永久代分配空间时没有足够空间的时候,会触发FullGC


4.代码中执行System.gc()
        代码中执行System.gc()的时候,会触发FullGC,但是并不保证一定会立即触发。

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

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

相关文章

Blender细节补充

1.饼状菜单,用于快速切换/选择 例如: ~:切换视图 Z:切换着色方式 ,:切换坐标系 .:切换基准点 Shift S:吸附 有两种使用方式: -点选 -滑选,按快捷键…

手机一键换ip地址到湖南

怎么把手机ip改成湖南?想要手机一键换ip地址到湖南,可以试试使用虎观代理app,一键操作,简单又方便。你会惊讶地发现,更改手机IP至湖南竟然如此便捷。 选用APP优势: ★IP资源丰富 已经在国内各大省份提供服…

Fastapi+docker+tortoise-orm+celery

因为项目是后期引入celery,所以导致构建docker的时候只有fastapi的项目,celery的重启比较麻烦 1.docker安装celery pip install celery安装celery的时候注意python版本与celery版本的适配,有些celery的版本不支持python的版本,具体的版本请看…

泰迪智能科技携手新乡学院开展“泰迪智能双创工作室”共建交流会

为深化校企合作,实现应用型人才培养目标。5月8日,广东泰迪智能科技股份有限公司河南分公司市场总监张京瑞到访新乡学院数学与统计学院参观交流,数学与统计学院院长赵国喜、副院长皮磊、张秦,教研室主任许寿方、姚广出席本次交流会…

【基础算法总结】二分查找一

二分查找一 1. 二分查找2.在排序数组中查找元素的第一个和最后一个位置3.x 的平方根4.搜索插入位置 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃&#x1…

Dependencies:查找项目中dll关联文件是否缺失。

前言 Dependencies工具作为一款优秀的DLL解析工具,能让你很直观地看到DLL的相关信息,如具备哪些功能函数、参数,又比如该DLL基于哪些DLL运行。判断该dll基于哪些dll运行,如果基于的dll丢失,那么就会提示。就能判断缺少…

RobbitMQ基本消息队列的消息接收

1.先给工程引入依赖 父工程有了子工程就不用导了 <!--AMQP依赖&#xff0c;包含RabbitMQ--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> 2.配置yml…

前端组件库图片上传时候做自定义裁剪操作

不论是vue还是react项目&#xff0c;我们在使用antd组件库做上传图片的时候&#xff0c;有一个上传图片裁剪的功能&#xff0c;但是这个功能默认是只支持1:1的裁剪操作&#xff0c;如何做到自定义的裁剪操作&#xff1f;比如显示宽高比&#xff1f;是否可以缩放和旋转操作&…

vue 中的 Vuex

Vuex Vuex是什么&#xff1f; 概念&#xff1a;专门在vue中实现集中式状态&#xff08;数据&#xff09;管理的一个Vue插件&#xff0c;对Vue应用中多个组件的共享状态进行集中式的管理(读/写&#xff09;&#xff0c;也是一种组件间通信的方式&#xff0c;且适用于任意组件间…

【二叉树算法题记录】二叉树的所有路径,路径总和——回溯

目录 257. 二叉树的所有路径题目描述题目分析cpp代码 112. 路径总和题目描述题目分析cpp代码 257. 二叉树的所有路径 题目描述 给你一个二叉树的根节点root &#xff0c;按任意顺序&#xff0c;返回所有从根节点到叶子节点的路径。 题目分析 其实从根节点往下走&#xff0c…

C语言/数据结构——(链表的回文结构)

一.前言 今天在牛客网上刷到了一道链表题——链表的回文结构https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?&#xff0c;巧合的是它的解题思路恰好是我们一起分享过两道链表题的汇总。这两道题分别是反转链表和链表的中间节点。废话不多数&#xff0c…

css 案例 横向滚动渐变

效果 完整代码&#xff1a; <template><view class"content"><view class"tab"><view class"tab-item" v-for"(item,index) in tab" :key"index" click"handlerTab(index)":class"ind…

Spring Cloud Gateway 11种断言工厂

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Spring Cloud Gateway路由匹配是Spring WebFlux基础功能的一部分,在Spri…

项目经理有哪些常见的沟通技巧?

项目经理有哪些常见的沟通技巧&#xff1f; 项目管理的核心之一是沟通。有效的沟通技巧对于确保项目团队成员之间的合作、项目信息的准确传达以及项目目标的顺利实现至关重要。一个号的项目管理工具可以让我们事半功倍&#xff0c;结合项目管理工具zz-plan 来探讨一些项目经理…

STM32F103RCT6#1

实验1 F103基准实验 1.1实验内容&#xff1a;验证以下基本功能&#xff1a;两个LED&#xff08;编号为LED1和LED2&#xff09;每500ms交替闪烁&#xff1b;计算机上的串口助手每秒输出一次字符串。 &#xff08;实验背景&#xff09;启动车辆时&#xff0c;首先将变速箱从驻车…

Baidu Comate 编程插件:提升开发效率的利器

文章目录 引言简介目的 Baidu Comate插件概述定义与功能市场现状竞品分析 安装与配置VsCode 安装&#xff1a;注意事项 版本选择 核心特性详解功能介绍代码生成实时续写错误纠正 使用体验体验地址 引言 简介 基于文心大模型&#xff0c;结合百度积累多年的编程现场大数据和外…

RFID读写头JY-V640在半导体wafer晶圆盒的使用流程

为了最大限度地提高生产效率&#xff0c;新的晶圆工厂和正在翻新升级的晶圆工厂选择采用RFID技术应用在半导体制造业上&#xff0c;通过RFID技术的非接触式采集信息特性&#xff0c;对晶圆盒在生产、存储、运输过程中进行信息追踪和管理&#xff0c;提升半导体制造业的生产效率…

洪水仿真模拟(ArcGIS),水利数字孪生新利器

这两天ArcGIS Pro的官方账号释放了一个名为“Flood Simulation in ArcGIS Pro”的洪水模拟功能视频。根据视频详情页的介绍&#xff0c;该洪水仿真模拟功能会作为新功能出现在ArcGIS Pro 3.3中。 由于我目前从事的主要应用方向都是弱GIS的领域&#xff0c;所以我已经很久没有再…

Selenium——获取元素和操纵元素的方法

1、获取元素的方法 1、通过id获取 element wd.find_element(By.ID,"id")2、通过classname获取 elements wd.find_elements_by_class_name("plant") for element in elements:print(element.text)3、通过tagname获取元素 elements wd.find_elements_…

Ubuntu20.04 设置路由器

1. 网络拓扑图 2. 查看网卡信息 ip a得出如下网卡信息&#xff0c;enp1s0和enp2s0为两个网卡名称&#xff0c;以及相关两个网卡的详细信息&#xff0c;不同设备的网卡名称可能不一样 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group defaul…