【jvm】分代年龄为什么是15次

目录

          • [1. 说明](#1. 说明)
          • [2. JVM堆内存结构](#2. JVM堆内存结构)
          • [3. 对象头中的GC年龄存储](#3. 对象头中的GC年龄存储)
          • [4. 设计考虑](#4. 设计考虑)
1. 说明
  • 1.JVM分代年龄设置为15次主要是由于对象头中用于存储GC年龄的bit位数限制(4个bit位最大能表示15)。
  • 2.这也是基于JVM内存管理和垃圾收集的设计考虑。
2. JVM堆内存结构
  • 1.在JVM的堆(Heap)内存里面,主要分为三个部分:伊甸园区(Eden Space)、Survivor区(包括From区和To区)、老年代(Old Generation)。
  • 2.伊甸园区:新创建的对象主要在伊甸园区分配内存。
  • 3.Survivor区:当伊甸园区的内存空间不足时,会触发Young GC(新生代垃圾收集)进行对象回收。那些因为存在引用关系而无法回收的对象,会被转移到Survivor区。Survivor区内部又分为From区和To区,刚从伊甸园区转移过来的对象会分配到From区。每经历一次Young GC,这些无法被回收的对象就会在From区和To区来回移动,每移动一次,这个对象的GC年龄就加1。
  • 4.老年代:当对象的GC年龄达到某个阈值时(默认为15),或者满足动态年龄判断的依据时,该对象会被转移到老年代。
3. 对象头中的GC年龄存储
  • 1.在HotSpot虚拟机中,一个Java对象在JVM内存中的布局由三个部分组成:对象头、实例数据、对齐填充。
  • 2.对象头包含了用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志等。这些信息被官方称为"Mark Word"。
  • 3.在对象头中,有4个bit位用于存储GC年龄。
  • 4.由于4个bit位能够存储的最大数值是1111(十进制就是15),因此JVM分代年龄的最大值就被限制为了15。
4. 设计考虑
  • 1.从设计角度来看,当一个对象触发了最大值15次Young GC还没有被回收时,这意味着该对象在新生代中存活了较长时间,有可能是一个长期使用的对象。
  • 2.JVM会将其移动到老年代,以便更好地管理内存和进行垃圾收集。
  • 3.JVM还引入了动态对象年龄判断的方式来决定把对象转移到老年代。
  • 4.即使一个对象的GC年龄没有达到15次,但只要满足动态年龄判断的依据(如对象大小、存活时间等),同样会被转移到老年代。
相关推荐
CodeAmaz21 分钟前
JVM一次完整GC流程详解
java·jvm·gc流程
笃行客从不躺平2 小时前
JVM 类加载机制复习
jvm
飞火流星020272 小时前
【Arthas工具】使用Trace命令分析Java JVM方法调用链路及耗时
java·jvm·arthas·jvm性能调优·java方法调用链路分析及耗时·jvm实时分析·jvm方法调用实时分析
7ioik2 小时前
JVM 调优工具深度指南:从监控到诊断的全流程实战
jvm
喵手3 小时前
JVM 基础知识:深入理解 Java 的运行时环境!
java·jvm·jvm基础·java运行环境
WizLC18 小时前
【JAVA】JVM类加载器知识笔记
java·jvm·笔记
CodeAmaz19 小时前
Java 垃圾回收(GC)算法详解
java·jvm·算法·垃圾回收算法
漫漫求21 小时前
Java内存模型【JMM】、JVM内存模型
java·开发语言·jvm
dddaidai1231 天前
深入JVM(三):JVM执行引擎
java·jvm
小羊学伽瓦1 天前
ThreadLocal
java·jvm·算法