【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次,但只要满足动态年龄判断的依据(如对象大小、存活时间等),同样会被转移到老年代。
相关推荐
今天的砖头有点烫手啊8 分钟前
JVM 调优实战:从 GC 日志到参数优化,一次完整排查
java·jvm
JAVA面经实录9173 小时前
MySQL问题定位与性能优化完整知识体系
java·jvm·数据库·mysql·性能优化
LCG元5 小时前
【实战】树莓派物联网开发:DHT11温湿度采集与MQTT云上报全流程
java·jvm·物联网
欢醉6 小时前
干货分享Gateway踩坑实录:Netty直接内存把网关吃垮了OutOfDirectMemoryError
jvm·springcloud
wuminyu1 天前
JDK21 FFM异步读取MSG_ZEROCOPY错误队列揭秘
java·linux·c语言·jvm·c++
YH55269842 天前
GPT‑5.6 Sol 原本支持 1M 上下文,Codex 现已放开此前限制,如何看待这次调整?
java·jvm·人工智能·gpt·算法·chatgpt
2602_959960922 天前
谢飞机面试大厂:Spring Boot、JVM、Redis、Kafka、微服务与音视频搜索场景求生实录
java·jvm·spring boot·redis·面试题
wuminyu2 天前
JDK21中虚拟线程和FFM协同实现高并发源码剖析
java·linux·c语言·jvm·c++
SWAGGY..2 天前
【C++进阶】:(1)继承机制详解
java·jvm·c++
一木 之林2 天前
三、内存管理、指针与堆栈
c语言·jvm·c++