【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次,但只要满足动态年龄判断的依据(如对象大小、存活时间等),同样会被转移到老年代。
相关推荐
m0_613856293 小时前
mysql如何利用事务隔离级别解决特定业务冲突_mysql隔离方案选型
jvm·数据库·python
Lumos_77710 小时前
Linux -- 线程
java·jvm·算法
qq_3926906611 小时前
Redis怎样应对Redis集群整体宕机带来的雪崩
jvm·数据库·python
X566116 小时前
SQL注入防御技术方案_基于正则表达式的输入清洗
jvm·数据库·python
c++之路17 小时前
C++ 高频易错点
java·jvm·c++
wuminyu17 小时前
专家视角看Java多态性的底层基石vtable(虚函数表)构建过程解析
java·linux·c语言·jvm·c++
tjl521314_2118 小时前
02C++ 静态变量与链接性
java·jvm·c++
让梦想再启航19 小时前
JVM详解
jvm
m0_748554811 天前
golang如何实现用户订阅偏好管理_golang用户订阅偏好管理实现总结
jvm·数据库·python
lee_curry1 天前
第四章 jvm中的垃圾回收器
java·jvm·垃圾收集器