Java代码执行时对象从新生代到老年代的流转过程

Java代码执行时对象从新生代到老年代的流转过程

作者:淘书创始人

摘要

Java代码执行时对象从新生代到老年代的流转过程


弄清楚Java代码执行时对象从新生代到老年代的流转过程,同时明确大对象、永久代、方法区、虚拟机栈这些核心概念的定义和作用,我会结合代码执行的实际场景,用通俗的语言逐一拆解,让你清晰理解每个概念的本质和关联。

一、对象从新生代到老年代的完整流转过程

Java代码执行时,new出来的对象会在堆中经历“新生代→老年代”的生命周期流转,核心是为了优化GC效率,这个过程就像“年轻人→老年人”的成长过程,具体分为以下步骤:

1. 第一步:新对象诞生在新生代Eden区

当你执行Object obj = new Object()这类代码时:

  • JVM首先在新生代的Eden区为对象分配内存(Eden是新对象的“出生地”);

  • 只有极少数特殊对象(比如大对象)会跳过Eden区,直接进入老年代;

  • 此时对象的“年龄”标记为0(年龄是对象经历Minor GC存活的次数)。

2. 第二步:Eden区满,触发Minor GC(新生代GC)

当Eden区内存耗尽时,JVM触发Minor GC(轻量GC):

  • 回收Eden区中“无用对象”(没有任何引用的对象);

  • 存活的对象(有引用的)会被复制到新生代的Survivor 0区(S0),同时对象年龄+1;

  • 清空Eden区,为新对象腾出空间。

3. 第三步:Survivor区的对象“存活与转移”

后续再触发Minor GC时:

  • Eden区存活对象 + S0区存活对象,会被复制到Survivor 1区(S1),所有存活对象年龄+1;

  • 清空Eden区和S0区,此时S0变为“空区”,S1变为“存活区”(两个Survivor区永远交替使用,必有一个为空);

  • 每次Minor GC,存活对象都会在Survivor区之间“搬家”,年龄持续增加。

4. 第四步:年龄达标,进入老年代

JVM默认设置对象年龄阈值为15(可通过-XX:MaxTenuringThreshold修改):

  • 当对象在Survivor区经历15次Minor GC仍存活,就会被“晋升”到老年代

  • 老年代专门存储生命周期长的对象(比如全局缓存对象、单例对象),这里的GC频率远低于新生代(只有老年代满时才触发Full GC)。

5. 特殊情况:提前进入老年代的场景

除了年龄达标,以下情况对象会直接/提前进入老年代:

  • Survivor区空间不足

    :某次Minor GC后,Survivor区放不下存活对象,这些对象会直接进入老年代(“空间分配担保”机制);

  • 大对象直接进入老年代

    :比如创建new byte[1024*1024*50](50MB字节数组),大对象会跳过新生代,直接分配到老年代(避免在Survivor区频繁拷贝);

  • 动态年龄判断

    :Survivor区中相同年龄的对象总和超过Survivor区空间的50%,年龄≥该值的对象会提前进入老年代(比如年龄3的对象占S0区60%,则年龄≥3的对象都进老年代)。

二、核心概念定义与作用(通俗版)

1. 大对象
  • 定义

    :指需要大量连续内存空间的对象(比如大数组、大字符串),JVM中可通过-XX:PretenureSizeThreshold设置阈值(比如设为10MB,超过则为大对象);

  • 核心特征

    • 直接进入老年代,避免在新生代Eden和Survivor区之间频繁拷贝(大对象拷贝耗时,降低GC效率);

    • 容易导致老年代内存快速耗尽,触发Full GC(比如频繁创建大对象,是性能优化的重点关注对象)。

2. 永久代(PermGen)
  • 定义

    :JDK7及之前版本中,方法区的实现方式(JVM规范中叫“方法区”,永久代是HotSpot虚拟机对方法区的具体实现);

  • 核心特征

    • 属于JVM堆内存的一部分(和新生代、老年代同属堆),有内存上限(默认较小),容易触发OutOfMemoryError: PermGen space

    • 存储内容:类元数据(类名、方法、字段)、常量池、静态变量、JIT编译代码;

    • JDK8彻底移除永久代

      ,替换为“元空间(Metaspace)”,元空间使用操作系统的本地内存,默认无上限,大幅降低OOM概率。

3. 方法区(Method Area)
  • 定义

    :JVM规范中的核心内存区域(线程共享),是“类的元数据仓库”,永久代/元空间是它的具体实现;

  • 核心特征

    • 存储内容:类的元数据(类加载后生成的Class对象)、运行时常量池、静态变量、方法字节码、JIT编译后的机器码;

    • 生命周期:类加载时存入,类卸载时回收(回收条件严格,只有无用类才会被回收);

    • 区别于堆:堆存“对象实例”(比如new Object()),方法区存“类的定义”(比如Object.class的元数据)。

4. 虚拟机栈(Java Virtual Machine Stack)
  • 定义

    :线程私有内存区域,是“方法执行的栈”,每个方法对应一个栈帧(Stack Frame),方法调用时压栈,执行完出栈;

  • 核心特征

    • 栈帧内容:局部变量表(存储方法内的局部变量,比如int a = 10)、操作数栈(方法执行的临时计算数据)、方法返回地址(执行完回到哪里);

    • 生命周期:随线程创建而创建,线程销毁而销毁(比如main线程结束,其虚拟机栈也释放);

    • 溢出场景:递归调用过深(栈帧过多)会抛出StackOverflowError,虚拟机栈内存不足会抛出OOM;

    • 关键区别:虚拟机栈存“方法执行的临时数据”(局部变量、执行状态),堆存“对象实例”,二者无交集。

三、核心概念关联示例(代码执行场景)

以这段简单代码为例,直观理解各概念的作用:

public class JVMDemo { // 静态变量(存在方法区/元空间) private static String CONST_STR = "hello jvm"; public static void main(String[] args) { // 局部变量a(存在main方法的栈帧局部变量表,虚拟机栈) int a = 10; // 小对象obj(先在新生代Eden区创建) Object obj = new Object(); // 大对象bigArr(直接进入老年代,假设超过PretenureSizeThreshold阈值) byte[] bigArr = new byte[1024*1024*20]; // 递归调用,增加虚拟机栈深度 test(obj); } public static void test(Object obj) { test(obj); // 递归→栈帧不断压入虚拟机栈→最终StackOverflowError } }
  • CONST_STR

    :静态变量,存在方法区(元空间);

  • a

    :局部变量,存在main方法的栈帧(虚拟机栈);

  • obj

    :对象实例,先在新生代Eden区创建,多次Minor GC存活后进入老年代;

  • bigArr

    :20MB大数组,直接进入老年代;

  • test()

    递归:栈帧不断压入虚拟机栈,最终触发StackOverflowError

总结

  1. 对象流转核心

    :新对象→新生代Eden区→Minor GC后到Survivor区(年龄+1)→年龄达标/空间不足→老年代;大对象直接跳过新生代进入老年代。

  2. 永久代vs方法区

    :方法区是JVM规范,永久代是JDK7及之前方法区的实现(堆内内存),JDK8后替换为元空间(本地内存)。

  3. 虚拟机栈核心

    :线程私有,存储方法栈帧(局部变量、执行状态),和堆无交集,随线程生灭,不会被GC回收。

  4. 大对象特征

    :占用连续内存大,直接进老年代,避免新生代频繁拷贝,是Full GC的潜在触发因素。

这些概念的核心都是为了优化JVM内存管理效率:堆分代减少GC耗时,大对象直接进老年代避免拷贝,虚拟机栈随线程销毁释放内存,方法区存储类元数据支撑类加载和执行。


原文链接: https://1024bat.cn/article/61

来源: 淘书1024bat

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1186469.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ACE-Step应用场景:元宇宙虚拟空间背景音景动态生成

ACE-Step应用场景:元宇宙虚拟空间背景音景动态生成 1. 技术背景与问题提出 随着元宇宙概念的持续演进,虚拟空间的沉浸感构建已成为关键挑战之一。在游戏、社交平台、数字孪生等场景中,静态或预设的背景音乐已难以满足用户对个性化、情境化音…

AI人脸卫士5分钟部署:云端镜像免安装,立即开始保护隐私

AI人脸卫士5分钟部署:云端镜像免安装,立即开始保护隐私 你是不是也遇到过这样的情况:手头有一批照片要发布,但里面有不少人脸信息,担心泄露隐私?尤其是社工机构、公益组织这类非技术背景的团队&#xff0c…

零配置运行BSHM模型,人像抠图效率翻倍

零配置运行BSHM模型,人像抠图效率翻倍 随着图像编辑、虚拟背景替换和短视频制作的普及,高质量的人像抠图技术成为视觉AI应用中的关键环节。传统方法依赖复杂的交互式操作或对硬件环境有较高要求,而基于深度学习的语义人像抠图模型&#xff0…

AI语音增强技术落地指南|结合FRCRN镜像实现高质量降噪

AI语音增强技术落地指南|结合FRCRN镜像实现高质量降噪 1. 引言:AI语音增强的现实挑战与解决方案 在智能硬件、远程会议、语音助手等应用场景中,环境噪声严重影响语音质量。传统滤波方法难以应对非平稳噪声,而基于深度学习的语音…

FunASR语音识别教程:如何实现多语言自动检测功能

FunASR语音识别教程:如何实现多语言自动检测功能 1. 引言 随着全球化交流的日益频繁,跨语言语音交互场景不断增多。在实际应用中,用户可能使用中文、英文、粤语、日语或韩语等多种语言进行语音输入,传统单一语言识别系统已难以满…

PDF-Extract-Kit核心功能解析|附布局检测与表格提取实践案例

PDF-Extract-Kit核心功能解析|附布局检测与表格提取实践案例 1. 技术背景与问题提出 在数字化办公和学术研究中,PDF文档已成为信息传递的主要载体。然而,PDF格式的封闭性使得内容提取变得复杂,尤其是包含复杂布局、公式、表格等…

Qwen3-Embedding-4B推荐配置:GPU显存与并发平衡方案

Qwen3-Embedding-4B推荐配置:GPU显存与并发平衡方案 1. 背景与问题提出 随着大模型在检索增强生成(RAG)、语义搜索、多模态理解等场景中的广泛应用,高质量文本嵌入模型的重要性日益凸显。Qwen3-Embedding-4B作为通义千问系列中专…

看完就想试!MinerU镜像将学术论文PDF秒变结构化笔记案例展示

看完就想试!MinerU镜像将学术论文PDF秒变结构化笔记案例展示 1. 引言 1.1 业务场景描述 在科研与工程实践中,研究人员每天需要处理大量来自不同来源的PDF文档,包括学术论文、技术报告、专利文件等。这些文档往往包含复杂的版面结构&#x…

视频剪辑新利器:SAM 3智能物体追踪全解析

视频剪辑新利器:SAM 3智能物体追踪全解析 1. 技术背景与核心价值 在视频编辑、内容创作和视觉特效领域,精确的对象分割与追踪一直是耗时且技术门槛较高的关键环节。传统方法依赖手动逐帧标注或复杂的跟踪算法,不仅效率低下,而且…

踩过这些坑才懂:Unsloth部署与训练避雷清单

踩过这些坑才懂:Unsloth部署与训练避雷清单 1. 引言 1.1 业务场景描述 随着大模型在企业级应用中的普及,如何高效地对LLM(Large Language Model)进行微调成为技术团队的核心需求。传统微调方式存在显存占用高、训练速度慢、部署…

verl使用心得:新手最容易忽略的细节

verl使用心得:新手最容易忽略的细节 1. 引言:从“能跑”到“跑得好”的关键跨越 在大语言模型(LLM)的后训练阶段,强化学习(Reinforcement Learning, RL)已成为提升模型对齐能力的核心手段。ve…

Glyph部署案例:私有化部署企业级视觉推理平台

Glyph部署案例:私有化部署企业级视觉推理平台 1. 引言:Glyph与企业级视觉推理的融合价值 1.1 视觉推理技术的演进背景 随着大模型在自然语言处理领域的持续突破,长文本上下文建模成为提升模型理解能力的关键。然而,传统基于Tok…

2026 华数杯ICM Problem B: Who Will Win the Global Competition in ArtificialIntelligence?2026国际高校数学建模竞赛

背景:2025年12月30日,CSX运输公司运营的一列载有危险化学品的列车在肯塔基州与田纳西州交界处脱轨。其中一节装载熔融硫磺的车厢起火,附近居民已接到疏散通知。事故未造成人员伤亡。熔融硫磺在常温下呈固态,受热后会转化为液态。其…

GPEN性能优化技巧:加快推理节省GPU资源

GPEN性能优化技巧:加快推理节省GPU资源 在使用GPEN人像修复增强模型进行图像处理时,虽然其生成质量高、细节还原能力强,但在实际部署中常面临推理速度慢和GPU显存占用高的问题。本文基于“GPEN人像修复增强模型镜像”环境(PyTorc…

Fun-ASR-MLT-Nano-2512服务管理:日志监控与自动重启

Fun-ASR-MLT-Nano-2512服务管理:日志监控与自动重启 1. 章节概述 随着多语言语音识别技术在智能客服、会议转录、跨语言内容生成等场景的广泛应用,模型服务的稳定性成为工程落地的关键挑战。Fun-ASR-MLT-Nano-2512 是阿里通义实验室推出的轻量级多语言…

从口语到规范文本:FST ITN-ZH镜像助力精准ITN转换

从口语到规范文本:FST ITN-ZH镜像助力精准ITN转换 在语音识别与自然语言处理的实际应用中,一个长期存在的挑战是:识别结果虽然“可读”,但难以直接用于结构化分析或下游任务。例如,ASR系统输出的“二零零八年八月八日…

Packet Tracer汉化后字体显示优化操作指南

让汉化版 Packet Tracer 显示更清晰:字体优化实战指南你有没有遇到过这种情况——好不容易找到了中文补丁,兴冲冲地把Packet Tracer汉化后打开,结果界面一堆乱码、文字挤成一团,按钮上的字只显示一半?菜单项重叠得根本…

轻量模型部署新范式:BERT镜像免配置一键启动方案

轻量模型部署新范式:BERT镜像免配置一键启动方案 1. 引言 在自然语言处理领域,语义理解是构建智能应用的核心能力之一。随着预训练语言模型的发展,BERT(Bidirectional Encoder Representations from Transformers)因…

零基础也能用!Emotion2Vec+ Large语音情感识别一键启动指南

零基础也能用!Emotion2Vec Large语音情感识别一键启动指南 1. 快速上手:从零开始运行语音情感识别系统 1.1 系统简介与核心能力 Emotion2Vec Large 是基于阿里达摩院开源模型构建的高性能语音情感识别系统,专为开发者和研究人员设计。该系…

从JK触发器转换到T触发器:深度剖析设计思路

从JK触发器到T触发器:一次精巧的逻辑重构实践在数字电路的世界里,看似简单的功能背后往往藏着深刻的设计智慧。比如,我们只需要一个能“翻转”状态的触发器——T触发器,但手头只有更通用的JK触发器,该怎么办&#xff1…