【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次,但只要满足动态年龄判断的依据(如对象大小、存活时间等),同样会被转移到老年代。
相关推荐
ZzzK,3 小时前
JAVA虚拟机(JVM)
java·linux·jvm
西红柿维生素3 小时前
JVM相关总结
java·jvm·算法
老赵的博客6 小时前
c++ unqiue指针
java·jvm·c++
mkhase9 小时前
9.12-QT-基本登陆界面实现
java·jvm·qt
緈諨の約錠12 小时前
JVM基础篇以及JVM内存泄漏诊断与分析
java·jvm
Slaughter信仰12 小时前
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第十三章知识点问答(15题)
java·开发语言·jvm
Java进阶笔记12 小时前
JVM默认栈大小
java·jvm·后端
凤山老林1 天前
SpringBoot 轻量级一站式日志可视化与JVM监控
jvm·spring boot·后端
Boop_wu1 天前
[数据结构] 队列 (Queue)
java·jvm·算法
Chan161 天前
JVM从入门到实战:从字节码组成、类生命周期到双亲委派及打破双亲委派机制
java·jvm·spring boot·后端·intellij-idea