当前位置: 首页 > news >正文

【JVM面试题】JVM分代年龄为何是15次?能设置为16吗?

系列文章目录

【JVM系列】第一章 运行时数据区
【JVM面试题】第二章 从JDK7 到 JDK8, JVM为啥用元空间替换永久代?
【JVM面试题】第三章 JVM分代年龄为何是15次?能设置为16吗?



  大家好,我是青花。拥有多项发明专利(都是关于商品、广告等推荐产品)。对广告、Web全栈以及Java生态微服务拥有自己独到的见解。曾经辅导过若干个计算机专业的学生进入到软件开发行业就业。希望和大家一起成长进步。
  今天给大家带来的文章:JVM分代年龄为何是15次?能设置为16吗?希望对同学们有所帮助。

文章目录

  • 系列文章目录
  • 一、堆内存划分
  • 二、GC
  • 三、对象头的存储结构
    • 3.1 对象头
      • 3.1.1、对象分代年龄
  • 四、精简回答
    • 4.1、GC方面
    • 4.2、对象头设置
    • 4.3、从设计角度来看
  • 总结


在这里插入图片描述

Java 面试专栏
JVM区域

JVM分代年龄为何是15次?能设置为16吗?

了解堆内存划分
了解JVM垃圾回收机制
了解对象头的存储结构

一、堆内存划分

    在JVM的堆(Heap)内存里面,分为伊甸园区(Eden space)、Survivor(From、TO)区、老年代(Old generation)。
在这里插入图片描述

二、GC

    当我们在Java里面使用new关键字创建一个对象的时候,JVM会在Eden区分配一块内存来存储这个对象。当Eden区的内存空间不足的时候,就会触发Minor GC(新生代GC)进行对象回收。那些因为存在引用关系而无法回收的对象,JVM会把他们转移到Survivor区。
    Survivor内部分为From区和To区,刚从Eden区转移过来的对象会分配到From区,每经历一次Young GC,这些没被回收的对象就会在From区和To区来回移动,每移动一次,这个对象的GC年龄就加1。默认情况下GC年龄达到15的时候,JVM就会把这个对象移动到Old generation。
在这里插入图片描述


三、对象头的存储结构

    一个对象的GC年龄,存储在对象头里面。在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例 数据(Instance Data)和对齐填充(Padding)。下面我们将从这三个方面认识对象的内存布局。

3.1 对象头

    对象头主要包含两部分信息:第一类是用于存储对象自身的运行时数据,对象头的另外一部分是类型指针,即对象指向它的类型元数据的指针,Java虚拟机通过这个指针来确定该对象是哪个类的实例。
    那么我们重点讲解下用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。官方称这部分数据为 “Mark Word” ,如下图所示。
在这里插入图片描述
在这里插入图片描述

3.1.1、对象分代年龄

    其中的age(对象分代年龄),可以看到它的存储空间是4bit,4bit最大值上限是十进制的15。

这里科普一下bit:
比特是英文binary digit的缩写。位(bit) 来自英文bit,音译为“比特”,表示二进制位。位是计算机内部数据储存的最小单位,11010100是一个8位二进制数。一个二进制位只可以表示0和1两种状态(2^1)。

二进制转换十进制:

十进制二进制4bit8bit
11000100000001
210001000000010
311001100000011
4100010000000100
5101010100000101
6110011000000110
7111011100000111
81000100000001000
91001100100001001
101010101000001010
111011101100001011
121100110000001100
131101110100001101
141110111000001110
151111111100001111
1610000超出范围00010000

四、精简回答

4.1、GC方面

    在使用new创建对象时,JVM会在Eden区分配一块内存来存储这个对象。当Eden区的内存空间不足的时候,就会触发Minor GC(新生代GC)进行对象回收。那些因为存在引用关系而无法回收的对象,JVM会把他们转移到Survivor区。
    Minor GC非常频繁,因此需要把Survivor区一直回收不了的数据,放到Old区,默认是S0、S1移动达到15次(GC年龄达到15)。

4.2、对象头设置

    HotSpot虚拟机对象头里用4bit来存储GC分代年龄,而4个bit能够存储的最大值是15。从这个角度来说, JVM分代年龄之所以设置成15次,是因为它最大能够存储的数值就是15。
    因此我们说,虽然JVM提供了参数来设置分代年龄的大小,但是这个大小不能超过15,也就不能设置为16。

4.3、从设计角度来看

    从设计角度来看,当一个对象触发了最大值15次Minor GC(新生代GC),还没有办法被回收,就只能移动到Old区。
    另外,设计者还引入了动态对象年龄判断的方式来决定把对象转移到Old区,不管这个对象的GC年龄是否达到15次,只要满足动态年龄判断的依据, 也同样会转移到Old区。


总结

本章节从GC方面、对象头设置、Minor GC(新生代GC)设计角度这3个方面,解析了JVM分代年龄为何是15次。
有兴趣的同学还可以扩展下,Minor GC(新生代GC)、Full GC的频率,什么条件触发?有哪些垃圾回收算法?等等。

相关文章:

【JVM面试题】JVM分代年龄为何是15次?能设置为16吗?

系列文章目录 【JVM系列】第一章 运行时数据区 【JVM面试题】第二章 从JDK7 到 JDK8, JVM为啥用元空间替换永久代? 【JVM面试题】第三章 JVM分代年龄为何是15次?能设置为16吗? 大家好,我是青花。拥有多项发明专利(都是…...

java三层架构/表现层-业务层-持久层

三层架构 什么是 Java 三层架构 三层架构是指:视图层view(表现层),服务层service(业务逻辑层),持久层Dao(数据访问层), Java的三层架构是指将Java程序分为三…...

视频监控这样做,简单又高效!

随着技术的不断进步,视频监控系统已经变得更加高效和智能,可以提供更全面的监控和分析功能,有助于提高安全性、管理效率和决策支持。 客户案例 超市连锁店 福建某全国性超市连锁店面临高额商品损失、偷窃问题,以及对客户安全和员工…...

掌握 Go 的计时器

简介 定时器是任何编程语言的重要工具,它允许开发人员在特定时间间隔安排任务或执行代码。在 Go 中,定时器是通过 time 包实现的,该包提供了一系列功能来创建、启动、停止和有效处理定时器。我们将探索 Go 中定时器的强大功能,并…...

嵌入式软件开发笔试面试

C语言部分: 1.gcc的四步编译过程 1.预处理 展开头文件,删除注释、空行等无用内容,替换宏定义。 gcc -E hello.c -o hello.i 2.编译 检查语法错误,如果有错则报错,没有错误则生成汇编文件。 gcc -S hello.i -o h…...

【Qt高阶】Linux安装了多个版本的Qt 部署Qt程序,出包【2023.10.17】

简介 linux系统下可执行程序运行时会加载一些动态库so,有一些是Qt的库,Qt的库会加载其他更基础的库。最后出包的时候需要把依赖的包整理到一个文件夹,来制作安装包。近期遇到已经将依赖的so文件拷贝至程序目录下,但还是调系统路径…...

OpenGL简介

OpenGL 本身并不是一个 API,它仅仅是一个由 Khronos组织 制定并维护的规范(Specification)。规范严格规定了每个函数该如何执行,以及它们的输出值。至于内部具体每个函数是如何实现的,将由 OpenGL 库的开发者自行决定。…...

持续集成工具jenkins操作

安装Jenkins 下载jenkins安装包 linux上下载jenkins失败 开始在windows上安装jenkins 1、先安装JDK https://jingyan.baidu.com/article/fdbd4277dd90f0b89e3f489f.html 免安装版本JDK只需要解压配置环境变量即可 2、安装Jenkins 参考文档: https://www.cnb…...

使用BurpSuite抓取HTTPS接口

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 原因设置方式 原因 BurpSuite之所以不能抓取https数据包,是因为BurpSuite作为中间人代理,我们和https网站之间的数据通信都是由BurpSuite来…...

移动硬盘被格式化了如何恢复数据?四步教你如何恢复

在日常生活中,我们常常会使用各种存储设备来保存和备份我们的重要数据。移动硬盘作为一种便携式的存储设备,被广泛应用于数据的存储和传输。然而,有时候我们会不小心将移动硬盘格式化,从而丢失了里面的数据。本文将介绍移动硬盘格…...

基于变电站自动化系统中的安全措施分析及应用

摘要:阐述变电运行中的问题,电气自动化系统与安全运行措施,包括自动控制设备的投入,电气自动 化与计算机技术相、设备数据的采集与处理、自动化系统的升级、人工智能技术的应用。 关键词:自动控制;数据采…...

18、监测数据采集物联网应用开发步骤(12.3)

阶段性源码下载 监测数据采集物联网应用开发步骤(12.2) 前端web UI开发 demo 核心代码文件: web/index.html web/index.js web/js/common.js web/init.dlls Web/init.js 程序运行之后在浏览器敲入如下内容访问数据接口: http://localhost:9000…...

什么是Mybatis?Mybaits有哪些优点?

MyBatis是一个开源的Java持久层框架,它可以将Java对象映射到关系型数据库中,同时提供了灵活、高效、易用的数据访问解决方案。 下面是对MyBatis的详细介绍: 1、SQL映射文件 MyBatis使用简单的XML文件或注解配置文件将Java对象映射到数据库…...

点云从入门到精通技术详解100篇-基于3D点云的曲面文字检测(续)

目录 3.2.3 手动特征提取 3.2.4 基于图绘制的 2D 网格平面生成 3.2.5 特征融合的多通道伪图像生成...

用 Java 在 PDF 中创建和管理图层,实现交互式文档

PDF 图层(也称为可见图层或附加图层等)是组织和管理 PDF 文档中内容可见性的一种方法。PDF 图层可用于创建交互式文档、隐藏或显示特定信息、创建多语言版本文档等。通过添加和删除图层,用户可以根据需要定制 PDF 文档指定内容的可见性与显示…...

公司oa是什么?一般公司oa有什么样功能?

公司OA(Office Automation)是指通过计算机和信息技术来实现办公自动化的系统。 它提供了一系列的功能和工具,用于协调、管理和处理公司内部的日常事务和流程。OA系统旨在提高工作效率、加强信息交流与共享、简化业务流程,并提供便…...

pytorch里面的 nn.Parameter 和 tensor有哪些异同点

简单来说,你可以把tensor看作是一个通用的数据结构,而nn.Parameter看作是一种特殊的tensor,这种tensor可以被优化以提高模型的性能。在创建模型参数时,你应该使用nn.Parameter而不是直接使用tensor,因为这样可以确保模…...

leetcode 37. 解数独

编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 数独部分…...

GIT 分支管理办法

GIT 分支管理办法 一. 大型项目分支管理中存在的痛点 大型项目中需求的上线存在很大的不确定性,而且往往存在多版本、多团队、多开发并行的情况。尤其是大型企业对上线分支中编号的管理十分严苛,严禁夹带上线。这时对于开发而言,没有一个好…...

网络代理的多重应用与安全保障

随着互联网的迅速发展,网络代理技术日益受到关注,并在各个领域展现出重要作用。本文将深入探讨Socks5代理、IP代理以及它们在网络安全、爬虫应用和HTTP协议中的多重应用,帮助读者更好地理解和应用这些关键技术。 1. Socks5代理与SK5代理的异…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么&#xff1f;它的作用是什么&#xff1f; Spring框架的核心容器是IoC&#xff08;控制反转&#xff09;容器。它的主要作用是管理对…...