JVM原理之完整的一次GC流程-程序员宅基地

技术标签: jvm  算法  java  前端  分布式  

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 尽量避免。

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_67402026/article/details/126411412

智能推荐

hadoop备战:hbase的分布式安装经验_hbase关闭时一直省略号-程序员宅基地

文章浏览阅读2k次。配置HBase时,首先考虑的肯定是Hbase版本与你所装的hadoop版本是否匹配,这一点我在之前的博客中已经说明清楚,hadoop版本与hbase版本的匹配度,那是官方提供的。下面的实验就是本人没参照版本匹配尝试投机的方法,出现了错误。_hbase关闭时一直省略号

完美世界2017秋招真题 【编程题】按序找到数组中最小的k个数(C++)_对于一个无序数组,数组中元素为互不相同的整数,请返回其中最小的k个数顺序与原数-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏2次。题目地址:http://exercise.acmcoder.com/quesexcuse?paperId=222题目:对于一个无序数组,数组中的元素为互不相同的整数,请返回其中最小的k个数,顺序与原数组中元素顺序一致。输入第一行为数组的长度n,需要返回的数目k,n >= k接下来n行为数组的n个元素,每行为一个整数_对于一个无序数组,数组中元素为互不相同的整数,请返回其中最小的k个数顺序与原数

mvtec deep learning tool下载百度网盘_mvctecdeeplearning下载-程序员宅基地

文章浏览阅读2.1k次。链接:https://pan.baidu.com/s/1Xj65MlQvXdOuC1oA-45YXQ提取码:yyds官网文件_mvctecdeeplearning下载

基于 FPGA 的彩色图像灰度化的设计实现_fpga图像灰化-程序员宅基地

文章浏览阅读1k次。本次实验主要是在上一节的基础上,加入图像处理模块,实现在 PC 端通过上位机下发尺寸为 400*480 大小的彩色图像数据到 FPGA 的串口,FPGA 通过串口接收的彩色图像数据并进行实时彩色图像灰度化处理,然后将原始彩色图像和处理后的图像拼接在一起并缓存在DDR3 中,最终在 TFT 屏上同时显示处理前的彩色图像和处理后的灰度图像。_fpga图像灰化

指针数组,二级指针,指向含有N个元素的一维数组的指针,指针的函数调用。_数组指针 指向一维数组-程序员宅基地

文章浏览阅读839次,点赞2次,收藏3次。讲解指针数组,指向含有N个元素的一维数组的指针,和指针的函数调用问题。。。_数组指针 指向一维数组

如何禁止不必要的 HTTP 方法,如DELETE,PUT,OPTIONS等协议访问应用程序_如何禁止delete,put,options-程序员宅基地

文章浏览阅读1.7w次。一、修改应用程序的server.xml文件的协议为HTTPS, disableUploadTimeout="true" enableLookups="false" maxThreads="25" keystoreFile="d:\tomcat.keystore" keystorePass="111111" protocol="org.apache.coyote_如何禁止delete,put,options

随便推点

CentOS 6找不到partprobe命令的解决方法-程序员宅基地

文章浏览阅读455次。yum install -y parted //在你的系统上安装这个软件包就可以用partprobe命令啦转载于:https://www.cnblogs.com/Actexpler-S/p/8426301.html_partpeobe: 未找到命令...

stm32学习笔记 PWR_pwr_backupaccesscmd-程序员宅基地

文章浏览阅读8k次,点赞7次,收藏25次。PWRSTM32的工作电压(VDD)为2.0~3.6V。通过内置的电压调节器提供所需的1.8V电源。当主电源VDD掉电后,通过VBAτ脚为实时时钟(RTC)和备份寄存器提供电源。__WFI(); 为arm内核的指令PWR 函数PWR_DeInit 将外设 PWR 寄存器重设为缺省值PWR_BackupAccessCmd 使能或者失能 RTC 和后备寄存器访问PWR_PVDCmd 使能或者失能可编程电压探测器(PVD)PWR_PVDLevelConfig 设置 PVD 的探测电压阈值PW_pwr_backupaccesscmd

微信小程序把玩(十四)button组件_小程序 美化 button-程序员宅基地

文章浏览阅读3.9w次,点赞9次,收藏14次。button按钮用的算是最普遍的组件之一。主要属性:wxmlDefalutPrimary

AIOT人工智能物联网+项目实战-程序员宅基地

文章浏览阅读2.4k次,点赞7次,收藏44次。关于AIOT相关内容以及项目实战点击此处学习,以下内容为简单介绍如果大家对AIOT(人工智能物联网)有兴趣,可以哦!!!本文将持续更新~~~ 希望大家在学习的道路上勇往直前AIOT(人工智能物联网)是人工智能和物联网的结合,目前是技术和产业发展的热点之一。最高人民法院发布《关于规范和加强人工智能司法应用的意见》提出到2025年,基本建成较为完备的司法人工智能技术应用体系,为司法为民、公正司法提供全方位智能辅助支持。_aiot

【渗透测试】kali使用教程(一):常用命令和基本工具使用_kali渗透教程-程序员宅基地

文章浏览阅读4w次,点赞36次,收藏316次。kali教程_kali渗透教程

微软改进的DSSM结构:_dssm改进 2023-程序员宅基地

文章浏览阅读190次。最近,微软的学者们又提出了一个观点:query与doc的相关程度是由query里的term与doc文本精准的匹配,以及query语义与doc语义匹配程度共同决定。而且,term匹配与term在doc中的位置和紧密度有较大关系。因此,他们用一个local model来表达term匹配程度,distribute model表达语义匹配程度,把这两个子模型放在同一个模型来训练。distribute model类似与DSSM来学习语义匹配关系。Local model的输入是一个nq∗ndnq∗nd的矩阵mm,..._dssm改进 2023

推荐文章

热门文章

相关标签