JVM 中一次完整的 GC 流程和对象如何晋升到老年代?

news2024/11/23 22:26:13

前言

今天来分享一道比较好的面试题,JVM 中一次完整的 GC 流程是怎样的以及对象如何晋升到老年代?对于这个问题,我们一起看看考察点和比较好的回答吧。

考察点

Java 虚拟机能够替我们回收内存空间,清除垃圾对象,因此了解其垃圾回收机制以及 JVM 是如何对堆内存管理考验的正是程序员的功底,了解了这方面的知识,才能够写出高质量的代码,避免内存泄漏,减少内存溢出等问题。这个问题就是面试官想考察我们是不是对 JVM 学习了解过以及对堆内存管理的认识。

回答

关于这个问题,我们在回答的时候先对 Java 堆内存的划分,再解释Minor GC、Major GC、Full GC最后再描述他们之间的转化流程。

JVM 的堆内存划分:堆内存是由新时代和老年代组成,新生代又包括 Eden 区、Survivor 区其中包括 S0、S1。
在这里插入图片描述

JVM 创建一个新的对象,首先会分配在 Eden 区(如果是大对象,会直接进入老年代),当 Eden 区满了以后,JVM 会触发一次 Minor GC,用来回收 Eden 区的垃圾。Eden 区存活下来的对象,会转移到Survivor 区。如果对象是在 Eden中出生,并经过第一次 Minor GC 后仍然存活,那这个时候,该对象的 GC 年龄会设置成 1。每熬过一次 Minor GC 该对象的 GC 年龄都会进行累加,如果超过默认的GC次数 15 次,这个对象就会转移到老年代。
当老年代满了无法容纳更多对象的时候,就会触发 Full GC,Full GC 会清理整个内存堆,包括年轻代、老年代。需要注意的是在进行 Full GC 之前,通常会先进行一次 Young GC,以尽可能地清理掉Eden 区和 Survivor 区中的垃圾对象,以减少 Full GC 的压力和耗时。在 YoungGC 以后,存活的对象将被复制到 Survivor 区或Old 区,而 Eden 区会被完全清空,等待下一次对象的分配。Major GC其实就是Full GC的另一种叫法。
以上就是我对于这个问题的理解。

总结

JVM 对堆内存进行分代管理,实现高效的垃圾回收,理解这些要有一定的技术积累。这个题目考察范围是在3年以上的程序员,希望读完这篇文章你有所收获。想要收获更多 JVM 面试题可参考下图。

在这里插入图片描述

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

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

相关文章

《嵌入式 - 嵌入式大杂烩》SVC和PendSV异常详解

1 操作模式 在讨论PendSV和SVC异常前,需要先了解Cortex-M的模式和两个特权等级。 Figure 1 1 操作模式和特权等级 两种模式为handler模式和线程(thread)模式,这两种模式是为了区别正在执行代码的类型;handler模式为异常处理例程的代码;线程模式为普通应用程序的代码。 两…

【云原生】Kubernetes 概述

Kubernetes 概述 1.Kubernetes 简介 Kubernetes 是一个可移植的、可扩展的、用于管理容器化工作负载和服务的开源平台,它简化(促进)了声明式配置和自动化。它有一个庞大的、快速增长的生态系统。Kubernetes 的服务、支持和工具随处可见。 K…

计算机视觉中的Transformer

几十年来,理论物理学家一直在努力提出一个宏大的统一理论。通过统一,指的是将被认为是完全不同的两个或多个想法结合起来,将它们的不同方面证明为同一基础现象。一个例子是在19世纪之前,电和磁被看作是无关的现象,但电…

HCIP-linux和kvm

1、linux linux安装教程参考,https://blog.51cto.com/cloudcs/5245337 yum源配置 本地yum源配置: 8版本配置:将光盘iso挂载到某个目录,/dev/cdrom是/dev/sr0软链接,# mount /dev/cdrom /mnt,# ls /mnt Ap…

项目知识点记录

1.使用druid连接池 使用properties配置文件: driverClassName com.mysql.cj.jdbc.Driver url jdbc:mysql://localhost:3306/book?useSSLtrue&setUnicodetrue&charsetEncodingUTF-8&serverTimezoneGMT%2B8 username root password 123456 #初始化链接数…

Python-OpenCV中的图像处理-霍夫变换

Python-OpenCV中的图像处理-霍夫变换 霍夫变换霍夫直线变换霍夫圆环变换 霍夫变换 霍夫(Hough)变换在检测各种形状的技术中非常流行,如果要检测的形状可以用数学表达式描述,就可以是使用霍夫变换检测它。即使要检测的形状存在一点破坏或者扭曲也是可以使…

《人月神话》:我所遇见的“焦油坑”

最近在读《人月神话》这本书。 发现大部分task延期和研发关系不是很大,技术为业务服务,但是偿还不了业务债。 焦油坑的概念源自于挖掘坑井时的一种不幸状况。当挖掘坑井时,首先会进入表土层,进展颇快。但接下来遇到了沥青或泥浆…

Highcharts引入

Highcharts是和jQuery一起使用的,所以需要下载好jQuery jQuery下载方式:访问:http://cdn.staticfile.org/jquery/2.1.4/jquery.min.js,然后全选复制到自己新建的txt文档中,最后把扩展名改为js。 Highcharts下载方式&…

红帽8.5 ansible 安装和部署 |(简单版)

安装 配置yum仓库: vim /etc/yun.repo.d/aliyun.repo [AppStream] nameApp baseurlhttps://mirrors.aliyun.com/centos/8-stream/AppStream/x86_64/os gpgcheck0[BaseOS] namebase baseurlhttps://mirrors.aliyun.com/centos/8-stream/BaseOS/x86_64/os gpgcheck…

安装PaddleOCR-2.7.0版本-笔记

安装PaddleOCR-2.7.0版本-笔记 先安装conda和python版本 本机安装的conda 22.9.0 python2.9.12 paddle2.4.2 paddlepaddle-gpu2.4.2 cuda10.2 安装完后,测试生成的结果如下所示: 一、第一步先激活环境 conda activate base conda activate base二、第…

线程介绍,线程与进程区别,如何使用多线程,Thread类,Runnable接口,补充知识(方法重载,方法重写)

引言:搞进程是为了什么呢? 满足并发编程,这样的需求,cpu多个核心,应用程序做出对应调整,让代码可以把多个核心充分利用起来~,当需要支持多个任务的时候——进程就十分关键了&#x…

8月9日上课内容 nginx反向代理与负载均衡

负载均衡工作当中用的很多的,也是面试会问的很重要的一个点 负载均衡:通过反向代理来实现(nginx只有反向代理才能做负载均衡) 正向代理的配置方法(用的较少) 反向代理的方式:四层代理与七层代…

Golang 函数定义及使用

文章目录 一、函数定义格式二、函数定义及使用 一、函数定义格式 //func: 函数定义关键字 //function_name:函数名称 //parameter_List: 函数参数列表,多个时使用逗号拆分 //return_types:函数返回类型,返回多个值时使用逗号拆分…

2023河南萌新联赛第(五)场:郑州轻工业大学-F 布鲁特佛斯

2023河南萌新联赛第(五)场:郑州轻工业大学-F 布鲁特佛斯 https://ac.nowcoder.com/acm/contest/62977/F 文章目录 2023河南萌新联赛第(五)场:郑州轻工业大学-F 布鲁特佛斯题意解题思路代码 题意 给定一个…

前后端分离------后端创建笔记(02)

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论,如有侵权请联系 源码:https://gitee.com/green_vegetables/x-admin-project.git 素材:https://pan.baidu.com/s/…

《甲午》观后感——GPT-3.5所写

《甲午》是一部令人深思的纪录片,通过生动的画面和真实的故事,向观众展示了中国历史上的一段重要时期。观看这部纪录片,我深受触动,对历史的认识也得到了深化。 首先,这部纪录片通过精心搜集的历史资料和珍贵的影像资料…

SLF4J日志绑定原理分析

前言 最近做项目,实际上也知道日志冲突的事,不过涉及MDC NDC数据传递,当日志框架冲突后,MDC和NDC就失效了,这里就涉及slf4j-api的MDC的绑定的过程,顺便分析了日志冲突实际生效的原因,理解SLF4J…

JavaScript类

JavaScript 类(class) 类是用于创建对象的模板。 我们使用 class 关键字来创建一个类,类体在一对大括号 {} 中,我们可以在大括号 {} 中定义类成员的位置,如方法或构造函数。 每个类中包含了一个特殊的方法 constructor(),它是类…

395. 至少有 K 个重复字符的最长子串

395. 至少有 K 个重复字符的最长子串 C代码:滑动窗口 ---- 不是吧,阿sir,这也能滑? // 返回滑动窗口的长度 // 满足条件的种类数量的可能为 [1, 26], 所以需要遍历26中情况的窗口长度 // 当 区间内所有种类数量 满足要求的种类数…

【Anaconda】安装及使用

知识目录 前言一、 Anaconda是什么二、为什么使用Anaconda三、安装步骤3.1 下载安装3.2 配置conda源 结语 前言 大家好!我是向阳花花花花,本期给大家带来的是 Anaconda 安装及使用。 每日金句分享:故事不长,也不难讲。』—— 「…