04、GC基础知识

JVM程序在跑起来之后,在数据的交互过程中,就会有一些数据是过期不用的,这些数据可以看做是垃圾,JVM中,这些垃圾是不用开发者管的,它自己会有一套垃圾回收系统自动回收这些内存垃圾,以备后面继续使用。这就是JVM的GC系统。GC这块知识很多,这篇文章主要是了解下它的基本知识点
1、如何定位垃圾
2、GC的回收算法
3、GC的内存分代模型

1、如何定位垃圾

  • 引用计数法:它的核心思想是,没有引用指向的内存区域是垃圾区域,GC可以回收这个区域。具体的做法是,每当有引用指向这个对象,它对应的计数就+1,当有引用取消了对它的指向就-1,如果计数为0的时候,它就会被GC自动回收。
    • 它的问题:引用计数法如果碰到循环引用的垃圾,就会失效。比如a引用b,b也引用a,但是他们整体的引用在程序中已经释放掉了,但是由于它们互相引用,引用计数永远不可能为0,所有它们永远不会被回收。
    • 它的解决方案是如下的“根可达算法”来解决
  • 根可达算法:它的核心思想是,如果一个对象没有根对象直接或间接的指向它,那它就是垃圾。具体的是要弄清楚哪些是属于根对象
    根对象
    • 根对象:
      • JVM Stacks里的对象(线程栈变量)
      • Native Method Stack(本地方法栈的对象)
      • Run-time Constant Pool(常量池里的对象)
      • Static Refercens In Method Area(方法区的静态对象)

      程序跑起来也就是main函数跑起来之后,它里面需要用到的对象都算是根对象,如线程栈变量和本地方法栈变量,然后就是用Static申请的对象,如果是字符串类型那就是常量池数据,如果是静态的引用那就是方法区的对象,这些算是根对象。它们直接或是间接引用的对象都不能算是垃圾。

2、GC回收算法

  • 标记清楚算法
    • 具体实现:第一阶段根据GCRoot规则把存活对象进行标记,第二阶段会清楚掉没有标记的对象
    • 特点:根据它的工作特点可以发现,清除之后留下来的内存不连续,会产生内存碎片。需要经过两次扫描,效率低
    • 使用场景:适用于对象存活时间长的情况,不如old区
  • 拷贝算法
    • 具体实现:首先把内存区域分为两部分A,B区域,一部分空置着(比如B区),等另外一部分(A区)满了之后,直接把A区存活对象复制到B区,然后把A区数据全部清除
    • 特点:内存位置连续,无碎片化,扫描一次即可,但是需要移动和复制内存对象,且浪费空间,有效利用率只有50%
    • 使用场景:适用于对象存活时间短的场景,比如年轻代的from区和to区
  • 标记压缩算法
  • 具体实现:它跟标记清楚算法类似,都需要经过两次扫描,不一样的是,第二阶段并不是删除未标记对象,而是把标记对象压缩到内存的一端,之后清理掉其他的空间
  • 特点:位置连续,没有碎片,内存的利用率也很高,但也是需要两次扫描且需要把对象移动到头部,效率偏低
  • 使用场景:适用于对象存活时间较长的情况,比如old区

3、GC内存分代模型

3.1、常见的GC,以及他们之间的组合

GC类型

Serial系列的GC是最早版本的,它都是单线程串行回收垃圾,一般针对几十兆内存的机器

  • Serial:底层用的是复制算法+单线程,用于年轻代回收
  • Serial Old:底层用的是标记压缩算法+但线程,用于老年代回收

PS+PO算法是JDK1.8版本以及之前版本默认的GC,他们都是并行回收的,一般能回收几个G的内存数据

  • Parallel Scavenge:拷贝算法+并行,用于年轻代
  • Parallel Old:标记清除算法+并行,用于老年代

PN+CMS算法是较新的一种组合,它们是期望用于更大内存的回收,其中PN算法是配合CMS对年轻代回收的一种算法

  • ParNew:拷贝算法+并行计算
  • CMS:三色标记算法+并行计算
  • G1,ZGC,Shenandoah:这些都是新一代的GC,后面会具体篇幅专门介绍。

3.2、GC的分代模型

Serial系列,Parallel Scavenge,Parallel Old,ParNew,CMS,这些都是逻辑和物理上都是进行分代的,G1是逻辑上分代,但是物理上是不分代的,之后的GC如ZGC,Shenandoah他们逻辑和物理上都不分代。如果分代的话,一般分为年轻代和老年代,他们默认的占比是New:Old=1:2

  • 年轻代:Eden+2个Survival区(from+to区),它们内存占比默认是8:1:1,其中一个区域满了就会触发YGC。from区和to区一般只有一个区域是在使用的
  • 老年代:垃圾相对于较少,如果满了之后会触发FullGC
3.2.1、对象在各个分代区域的流转规则
  • Young区的数据流转

在Young区,如果Eden区满了,就会触发YGC,就会把Eden区存活的对象复制到from区,然后清除掉Eden,如果from区满了,会把数据复制到to区,清除掉from,Young区的流转大致如上所述。

  • Old区的数据流转

Old 区的数据都是从Young流转过来的,具体的流转条件如下所述

  • 大对象直接进入Old区(通过GC参数-XX:+MaxTenuringThreshold 来设定)
  • 动态年龄:如年龄1的占33%,年龄2的占33%,年龄3的占34%,年龄2+年龄3>50%,所以年龄2,3的对象同时晋升到old区
  • 分配担保:YGC期间Survivor区空间不够时,担保的空间直接进入Old区
  • age年龄到了15岁时会进入Old区

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

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

相关文章

一、STM32MP257开发板初体验

文章目录 STM32MP257开发板初体验1. 硬件介绍2. 下载编译源码3. 烧录4. 启动 STM32MP257开发板初体验 从本篇文章开始本专栏将详细记录学习STM32MP257过程中的学习心得,旨在详细掌握嵌入式LINUX中的全流程内容,主要包括启动流程分析、驱动分析、Yocto系…

分析M0G突破后急剧下跌内因,x.game阐述不利面延续多久

MOG最新消息显示,美国唐纳德-的一则声明公开表示支持一种基于以太坊网络ERC-20代币标准的病毒式meme代币——Mog Coin(MOG),这一消息迅速发酵。然而,令人意想不到的是,在这位全球知名政治人物的背书之后&am…

P8772 求和 P8716 回文日期

文章目录 [蓝桥杯 2022 省 A] 求和[蓝桥杯 2020 省 AB2] 回文日期 [蓝桥杯 2022 省 A] 求和 题目描述 给定 n n n 个整数 a 1 , a 2 , ⋯ , a n a_{1}, a_{2}, \cdots, a_{n} a1​,a2​,⋯,an​, 求它们两两相乘再相加的和,即 S a 1 ⋅ a 2 a 1 ⋅ a 3 ⋯ a…

【优选算法】二分算法(在排序数组中查找元素的第一个和最后一个位置,寻找峰值,寻找排序数组中的最小值)

二分算法简介: 提到二分我们可能都会想起二分查找,二分查找要求待查找的数组是有序的,与我们今天讲的二分算法不同,并不是数组元素严格按照有序排列才可以使用二分算法,只要数组中有一个点可以将数组分为两个部分&…

升级Ubuntu 24.04 LTS报错“Oh no! Something has gone wrong.”

强烈建议:升级Ubuntu系统之前先配置好SSH远程访问 最近升级Ubuntu系统(18->24),经历了一些惊魂时刻,复盘下来没有重装系统的最得益于SSH访问。 在升级到24.04版本时,一切似乎表现得很正常,…

大模型底座 Transformer 的核心技术解析

1. 引言 说明目标 在深度学习领域,Transformer架构已成为近年来最重要的技术突破之一。它最早由Vaswani等人在2017年的论文《Attention is All You Need》中提出,迅速成为自然语言处理(NLP)和其他序列建模任务的核心工具。传统方法…

2.生成Transformation

目录 前言 Source FlatMap KeyBy sum print 总结 前言 以下面的WordCount为例 package com.wlh.p1;import org.apache.flink.api.common.functions.FlatMapFunction; import org.apache.flink.api.java.functions.KeySelector; import org.apache.flink.api.java.tuple…

1. 机器学习基本知识(3)——机器学习的主要挑战

1.5 机器学习的主要挑战 1.5.1 训练数据不足 对于复杂问题而言,数据比算法更重要但中小型数据集仍然很普遍,获得额外的训练数据并不总是一件轻而易举或物美价廉的事情,所以暂时不要抛弃算法。 1.5.2 训练数据不具有代表性 采样偏差&#…

TypeScript学习路线图

‌ TypeScript 是由微软开发和维护的一种静态类型编程语言,它是 JavaScript 的超集。TypeScript 的创建是为了解决构建大规模 JavaScript 应用程序所面临的挑战,并向该语言添加了可选的类型注解、类、接口和其他特性。 使用 TypeScript 的主要好处包括&a…

负载均衡oj项目:编译模块

编译运行模块是一个网络服务&#xff0c;这样编译模块就可以可以快速部署到&#xff0c;其他主机上。 编译模块思路 util.hpp #pragma once #include <string> #include <vector> #include <sys/types.h> #include <sys/stat.h> #include <unistd…

绿色浪潮,VELO Angel Glide坐垫奏响环保骑行乐章

地球的环境日益恶劣&#xff0c;冰川消融、海平面上升、极端天气频繁出现&#xff0c;这一切都在不断提醒着我们&#xff0c;保护地球家园刻不容缓。而在这场关乎人类未来的环保行动中&#xff0c;各个领域都在积极探索可持续发展的道路&#xff0c;自行车坐垫领域也迎来了绿色…

【从零开始入门unity游戏开发之——C#篇09】if-else条件表达式、三元运算符、switch-case的使用

文章目录 一、if条件表达式1、if 语句基本结构示例输出&#xff1a; 2、else语句示例输出&#xff1a; 3、else if 语句示例输出&#xff1a; 4、组合逻辑运算符示例输出&#xff1a; 5、嵌套 if 语句示例输出&#xff1a;总结 二、三元运算符1、语法&#xff1a;2、示例&#…

Visual Studio 使用 GitHub Copilot 扩展

&#x1f380;&#x1f380;&#x1f380;【AI辅助编程系列】&#x1f380;&#x1f380;&#x1f380; Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码Visual Studio 安装和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 扩展Visual Studio 使用 GitHu…

conda学习

参考: Anaconda 官网教程 https://freelearning.anaconda.cloud/get-started-with-anaconda/18202conda配置虚拟环境/conda环境迁移/python环境迁移 https://blog.csdn.net/qq_43369406/article/details/127140839 环境&#xff1a; macOS 15.2Anaconda Navigator 2.4.2 x.1…

Nginx配置示例教程

最近对Nginx做了一些初步研究&#xff0c;Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发。主要根据工作中各类应用服务部署访问的需求&#xff0c;围绕HTTP服务、负载均衡、正反向代理、子路由、静态资源发布访问等&#xff0c;以及结合minio管理的图片文件资…

git使用教程(超详细)-透彻理解git

一.核心基础 核心概念有六个 首先请把与svn有关的一切概念暂时从你的脑海中移除掉&#xff0c;我们要重新认识本文所讲述的所有概念。 1.worktree worktree是一个目录&#xff0c;你在这里对文件进行增加、删除、修改。也就是我们常说的工作区。在git中worktree必须要与一个…

Django结合websocket实现分组的多人聊天

其他地方和上一篇大致相同&#xff0c;上一篇地址点击进入, 改动点1&#xff1a;在setting.py中最后再添加如下配置&#xff1a; # 多人聊天 CHANNEL_LAYERS {"default":{"BACKEND": "channels.layers.InMemoryChannelLayer"} }因此完整的se…

Keil-MDK开发环境编译后axf自动转换bin格式文件

编译选项添加如下&#xff0c;调用fromelf工具自动完成转换&#xff1a; fromelf --bin -o "$LL.bin" "#L"

如何快速搭建若依管理系统?

1、下载若依管理系统前后端分离版代码至本地&#xff08;当前版本为RuoYi v3.8.8&#xff09;&#xff1a; RuoYi-Vue: &#x1f389; 基于SpringBoot&#xff0c;Spring Security&#xff0c;JWT&#xff0c;Vue & Element 的前后端分离权限管理系统&#xff0c;同时提供…

【JavaEE】网络(1)

&#x1f435;本篇文章开始讲解计算机网络相关的知识 一、基础概念 1.1 局域网和广域网 局域网→Local Area Network→简称LAN&#xff0c;局域网是局部组建的一种私有网络&#xff0c;局域网内的主机之间可以进行网络通信&#xff0c;局域网和局域网之间在没有连接的情况不能…