JVM原理之完整的一次GC流程

2023-05-16

JVM 的 GC 是指垃圾回收,主要是对堆内存的回收。本文将介绍 JVM 中一次完整的 GC 流程是怎样的,首先抛出第一个问题,什么样的对象会是 JVM 回收的目标?

一、可达性分析算法(GC Roots)

有一种引用计数法,可以用来判断对象被引用的次数,如果引用次数为0,则代表可以被回收。

这种实现方式比较简单,但对于循环引用的情况束手无策,所以 Java 采用了可达性分析算法

即判断某个对象是否与 GC Roots 的这类对象之间的路径可达,若不可达,则有可能成为回收对象,被判定为不可达的对象要成为可回收对象必须至少经历两次标记过程,如果在这两次标记过程中仍然没有逃脱成为可回收对象的可能性,则基本上就真的成为可回收对象了。

在 Java 中,可作为 GC Roots 的对象包括以下几种:

  1. 虚拟机栈(本地变量表)中引用的对象
  2. 方法区中类静态属性引用的对象
  3. 方法区中常量引用的对象
  4. 本地方法栈中引用的对象

二、JVM中的堆结构

JVM 中的堆可划分为两大部分,新生代和老年代,大小比例为1:2,如下:

其中,新生代分为 Eden 区和 Survivor 区, Survivor 幸存者区又分为大小相等的两块 from 和 to 区。这便是 JVM 中堆的结构和各部分默认的比例,当然这些比例都可通过对应 JVM 参数来调整。

2.1 为何新生代要分为三个区

这里需要介绍新生代的垃圾回收算法——复制算法。该算法的核心是将可用内存按容量划分为大小相等的两块,每次回收周期只用其中一块,当这一块的内存用完,就将还存活的对象复制到另一块上面,然后把已使用过的内存空间清理掉。

  • 优点:不必考虑内存碎片问题;效率高。
  • 缺点:可用容量减少为原来的一半,比较浪费。

【最优设置】:根据权威数据分析,90%的对象都是朝生夕死的,所以采用10%的空间用作交换区,因为交换区必须要有等量的两个,所以采用复制算法中新生代中三个区默认分配比例为8:1:1。

2.2 新生代对象的分配和回收

(1)基本上新的对象优先在 Eden 区分配;

(2)当 Eden 区没有足够空间时,会发起一次 Minor GC

(3)Minor GC 回收新生代采用复制回收算法的改进版本,即

  • from 区和 to 区的两个交换区,这两个区只有一个区有数据
  • 采用8:1:1的默认分配比例(**-XX:SurvivorRatio**默认为8,代表 Eden 区与 Survivor 区的大小比例)

2.3 老年代对象的分配和回收

(1)老年代的对象一般来自于新生代中的长期存活对象。这里有一概念叫做年龄阈值,每个对象定义了年龄计数器,经过一次 Minor GC (在交换区)后年龄加1,对象年龄达到_15次后将会晋升到老年代,老年代空间不够时进行 Full GC。当然这个参数仍是可以通过 JVM 参数(-XX:MaxTenuringThreshold_,默认15)来调整。

(2)大对象直接进入老年代。即超过 Eden 区空间,或超过一个参数值(-XX:PretenureSizeThreshold=30m,无默认值)。这样做的目的是避免在Eden区及两个Survivor区之间发生大量的内存复制。

(3)对象提前晋升到老年代(组团)。动态年龄判定:如果在 Survivor 区中相同年龄所有对象大小总和大于 Survivor 区大小的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,而无须等到自己的晋升年龄。

三、JVM完整的GC流程

对象的正常流程:Eden 区 -> Survivor 区 -> 老年代

新生代GC:Minor GC;老年代GC:Full GC,比 Minor GC 慢10倍。

【总结】:内存区域不够用了,就会引发GC,JVM 会“stop the world”,严重影响性能。Minor GC 避免不了,Full GC 尽量避免。

【处理方式】:保存堆栈快照日志、分析内存泄漏、调整内存设置控制垃圾回收频率,选择合适的垃圾回收器等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM原理之完整的一次GC流程 的相关文章

  • Centos防火墙配置

    一 防火墙的概念 防火墙技术是用于安全管理的软件和硬件设备 xff0c 在计算机内 外网之间构建一道相对隔绝的保护屏障 xff0c 以保护数据和信息安全性的一种技术 防火墙分为网络防火墙和主机防火墙 网络防火墙由软件和硬件组成 xff0c
  • linux 线程的调度策略

    目录 一 调度策略 1 实时线程 2 非实时线程 3 抢占式调度策略 运行特点 xff1a 4 轮询式调度策略 运行特点 xff1a 二 设置线程的调度策略步骤 1 定义线程句柄 2 定义线程属性结构体 3 初始化属性结构体 4 设置线程是
  • 16选1数据选择器和32选1数据选择器multisim

    大致思路 xff1a xff08 正经内容在下边 xff09 学校期中考试 xff0c 搜了半天发现连16 1都很难搜到 xff0c 一整天做出来 xff0c 趁着还有兴致记录一下过程 老师上课只教了4 1数据选择器 xff0c 于是先从8
  • 【软件工程】对软件工程课程的希望及个人目标

    自我简介 首先进行一下自我介绍 xff0c 我是一名桂林理工大学信息科学与工程学院的本科在读生 xff0c 现已经是本科二年级的学生了 xff0c 上个学期我们刚经历了专业分流 xff0c 很幸运 xff0c 我来到了我所希望来到的软件工程
  • 网络设备驱动介绍-linux驱动开发第11部分-朱有鹏-专题视频课程

    网络设备驱动介绍 linux驱动开发第11部分 3869人已学习 课程介绍 本课程是linux驱动开发的第11个课程 xff0c 主要内容是linux的网络驱动的介绍 xff0c 首先讲述了网络设备驱动接口和之前讲的2种的不同 xff0c
  • 六、如何使用VS调试代码、条件语句

    how to use Visual Studio to debug our code 查看程序断点 调试程序 1 设置断点 断点 xff0c 调试器将中断 xff0c break xff0c 程序调试是将会中断 xff0c continue
  • 【FPGA】Verilog:组合电路 | 3—8译码器 | 编码器 | 74LS148

    前言 xff1a 本章内容主要是演示Vivado下利用Verilog语言进行电路设计 仿真 综合和下载 示例 xff1a 编码 译码器的应用 功能特性 xff1a 采用 Xilinx Artix 7 XC7A35T芯片 配置方式 xff1a
  • ipv6简介

    IPv6地址扩展到128位 2128足够大 xff0c 这个地址空间可能永远用不完 事实上 xff0c 这个数足够为地球上每个分子分配一个IP地址 IPv6地址采用冒号分隔的十六进制数表示 xff0c 例如下面是一个IPv6地址8000 0
  • Nginx -- SSL模块

    目录 一 什么是ssl证书 二 证书的作用 1 浏览器绿色安全标志 2 网站数据加密传输 3 安全标志获得访客信任 4 强大的加密等级保障 5 SSL证书帮助网站保护了用户和网站之间的任何数据的安全 三 SSL证书的类别 1 按照验证方式
  • shell的echo命令

    echo命令用于在shell中打印shell变量的值 xff0c 或者直接输出指定的字符串 linux的echo命令 xff0c 在shell编程中极为常用 在终端下打印变量value的时候也是常常用到的 xff0c 因此有必要了解下ech
  • 2022最新hexo最新搭建教程

    本文时间 xff1a 2022 02 03 安装包版本如下 xff1a NodejsLTS16 13 2 Git2 35 0 成果预览 故人随笔 nodejs安装 1 双击安装包 2 Next 3 修改安装目录为 D Develop nod
  • 子网划分与子网汇总

    1 192 168 1 0 255 255 255 128 划分为4个子网 192 168 1 0 27 192 168 1 1 192 168 1 31 192 168 1 96 27 192 168 1 32 192 168 1 63
  • mongodb 启动rails server

    oot 64 5d5b156fb1b0 cat etc release DISTRIB ID 61 Ubuntu DISTRIB RELEASE 61 20 04 DISTRIB CODENAME 61 focal DISTRIB DESC
  • Shell 脚本中的变量

    文章目录 1 变量概述1 1 变量类型1 2 变量的命名要求1 3 变量作用范围 2 局部变量3 环境变量3 1 系统内置环境变量3 2 环境变量的配置文件 4 只读变量5 位置变量 1 变量概述 变量即在程序运行过程中它的值是允许改变的量
  • Hadoop-HDFS 写数据流程

    HDFS写数据流程 xff1a 客户端向NameNode请求写数据 NameNode判断客户端针对该文件是否有写的权限 没有则报错 再判断文件是否存在 xff0c 不存在则报错 xff0c 存在则通知客户端上传 HDFS客户端负责对文件进行
  • 6.小项目.图片解码播放器-朱有鹏-专题视频课程

    6 小项目 图片解码播放器 6707人已学习 课程介绍 本课程是 朱有鹏老师嵌入式linux核心课程 第6部分 xff0c 是一个课程后的小项目 用开发板本身自带的硬件完成一个基于linux API开发的图片解码播放器 xff0c 实现了对
  • 思科arp欺骗攻击,cdp攻击,DHCP攻击实验命令笔记

    目录 Kali主机扫描 双向攻击 Cdp攻击防护 Stp攻击防护 Kali主机扫描 fping s r 2 g 192 168 1 0 24 扫描网段内存活的主机 arping 192 168 1 1 探测主机是否存活 双向攻击 Arpso
  • 命令草稿集

    port hybrid pvid vlan vlan id 指定Hybrid接口的缺省VLAN ID xff0c 缺省VLAN 1 以太网帧在无线接入控制器中都是以Tagged的形式处理转发的 xff0c 设备必须给接口收到的Untagge
  • mkdir和chmod命令

    1 在 usr目录中新建一个目录名称为 xff1a mytest 并在mytest目录中新建文件net txt 设置文件的属性为文件属主 xff08 u xff09 增加执行权限 文件属主同组用户 xff08 g xff09 增加写入权限
  • Eigen中的SparseMatrix(稀疏矩阵)元素的快速插入

    Eigen中的SparseMatrix xff08 稀疏矩阵 xff09 元素的快速插入 辰宸的备忘录 licc tech Eigen SparseMatrix lt float gt m 3 3 std vector lt Eigen T

随机推荐

  • 【Ubuntu22.04.2中文系统转换,添加中文输入法,修改快捷键】

    上一篇带大家完成了Ubuntu的安装 xff0c 现在来看看答应大家的后续吧 好多人安装Ubuntu后发现是英文 xff0c 找不到怎么切换中文系统和中文输入法 xff0c 今天本多就带大家来看看吧 xff08 看完哦 xff0c 最后面有
  • curl (7) Failed connect to localhost8080; Connection refused

    curl 7 Failed connect to localhost 8080 Connection refused 如果你也是curl 百度是正常的 xff0c curl xff08 自己IP xff09 正常 xff0c 但是 一 cu
  • Java面试基础篇

    Java面试基础篇 基础总结 博客链接导航 Java语言基础常识 https blog csdn net article details 88531257 J2EE基础知识 https blog csdn net article detai
  • 关于Mysql1251解决办法

    问题 xff1a 相信有些小伙伴在用Navicat连接Mysql时 xff0c 都遇到了这样的情况 xff0c 这其实是8 0以后的加密规则问题 解决办法 xff1a 1 我们打开以管理员身份打开cmd管理器 2 输入cdC Program
  • vue-router4路由报“[Vue Router warn] No match found for location with path“

    这里出现该问题的原因 xff1a 在路由配置了参数路径 但是 xff0c 跳转的路径没有参数 xff1a 因此控制台出现了 xff1a
  • Chrome(谷歌浏览器)安装Vue插件vue-devtools(图文详细教程)

    使用Vue开发项目时 xff0c 常会用到一款谷歌浏览器插件 xff0c vue devtools 安装成功后 xff0c 运行本地Vue项目 xff0c 打开浏览器控制台就如下 xff1a 其中可以便捷的查看vueX的数据以及组件结构等
  • 你不能错过的单片机课程-1.1.第1季第1部分-朱有鹏-专题视频课程

    你不能错过的单片机课程 1 1 第1季第1部分 3111人已学习 课程介绍 本课程是 朱有鹏老师单片机完全学习系列课程 第1季第1个课程 xff0c 旨在对整个课程体系 学习方法和思路 配套开发板等进行介绍 xff0c 学习完本课程将对整个
  • redis如何设置密码

    密码设置 这里简单介绍一下redis如何设置密码 redis密码设置有两种方式 xff0c 一种需要重启redis服务 xff0c 一种不需要重启redis服务 首先 xff0c 介绍一下需要重启redis服务的设置方式 即找到redis的
  • linux 查看IP地址

    参考资料整理 一 在 linux 下可以通过两个命令来查看本机的 IP 地址 xff1a 1 支持包括 Linux 在内的所有 Unix 系统 sbin ifconfig 2 对于Linux 而言 xff0c 也可以使用 ip 命令查看 x
  • Docker 查看镜像信息

    本文中 xff0c 我们将需要学习 Docker 如何查看镜像信息 xff1f 一 images 命令列出镜像 通过使用如下两个命令 xff0c 列出本机已有的镜像 xff1a docker images 或 xff1a docker im
  • Google Chrome(谷歌浏览器)安装使用

    谷歌浏览器官网https www google cn chrome Chrome是由Google开发的一款简单便捷的网页浏览工具 谷歌浏览器 Google Chrome 可以提帮助你快速 安全的搜索到自己需要的内容 xff0c 功能强大 x
  • IDEA创建一个JavaWeb项目详细步骤

    刚好最近在写数据库大作业任务书 xff0c 留了一份 xff0c 发在博客上 提前说明 使用IDEA 43 Html5 43 CSS 43 JavaWeb 43 MySql开发 并使用Tomcat部署在本地服务器上 其中JDK版本为1 8
  • Nacos集群配置以及在springboot中使用

    1 下载nacos 官方地址为https github com alibaba nacos 2 将nacos解压 最好不要有中文路径 将cluster conf example文件改名为cluster conf 添加如下配置127 0 0
  • Windows下安装Nginx

    一 引言 Nginx 是一个很强大的高性能Web和反向代理服务 也是一种轻量级的Web服务器 可以作为独立的服务器部署网站 应用非常广泛 特别是现在前后端分离的情况下 而在开发过程中 我们常常需要在window系统下使用Nginx作为Web
  • Linux安装curl完整步骤

    文章目录 1 安装步骤 1 安装步骤 下载curl安装包 xff1a wget http curl haxx se download curl 7 38 0 tar gz 解压 xff1a tar xzvf curl 7 38 0 tar
  • 前端案例:简易计算器的实现(dom操作、target、eval函数、try catch、switch-case)

    目录 一 案例效果 二 涉及要点 三 完整代码 43 详细注释 一 案例效果 二 涉及要点 1 文本域标签 的 readonly 属性用于设置文本域文字为只读 xff1b 2 DOM 获取元素 xff0c getElementById 获取
  • 单片机到底是个什么东西-1.2.第1季第2部分-朱有鹏-专题视频课程

    单片机到底是个什么东西 1 2 第1季第2部分 2575人已学习 课程介绍 本课程是 朱有鹏老师单片机完全学习系列课程 第1季第2个课程 xff0c 用通俗易懂的语言讲了很多和单片机有关的技术概念 xff0c 如CPU ROM RAM 外设
  • Requirement already satisfied解决办法

    遇到的问题 xff1a 当使用电脑中安装的Python 3 7的IDLE去运行某一个python文件时 xff0c 会出现ModuleNotFoundError No module named 39 numpy 39 的报错 xff0c 需
  • 高校学籍管理系统(SQL Server数据库课程设计)

    目录 1 概述 1 1数据库设计选题背景1 2功能要求1 3系统功能解决的问题 2 需求分析3 概念结构设计 3 1抽象出系统的实体3 2设计实体属性图3 3全局E R图 4 逻辑结构设计5 数据库物理设计与实施 5 1数据库关系图5 2表
  • JVM原理之完整的一次GC流程

    JVM 的 GC 是指垃圾回收 xff0c 主要是对堆内存的回收 本文将介绍 JVM 中一次完整的 GC 流程是怎样的 xff0c 首先抛出第一个问题 xff0c 什么样的对象会是 JVM 回收的目标 xff1f 一 可达性分析算法 xff