婚介网站方案wordpress 判断文章页
2026/4/6 11:11:23 网站建设 项目流程
婚介网站方案,wordpress 判断文章页,域名是什么有什么用,南通网站建设优化Java代码执行时对象从新生代到老年代的流转过程作者#xff1a;淘书创始人摘要Java代码执行时对象从新生代到老年代的流转过程弄清楚Java代码执行时对象从新生代到老年代的流转过程#xff0c;同时明确大对象、永久代、方法区、虚拟机栈这些核心概念的定义和作用#xff0c;…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存活后进入老年代•bigArr20MB大数组直接进入老年代•test()递归栈帧不断压入虚拟机栈最终触发StackOverflowError。总结对象流转核心新对象→新生代Eden区→Minor GC后到Survivor区年龄1→年龄达标/空间不足→老年代大对象直接跳过新生代进入老年代。永久代vs方法区方法区是JVM规范永久代是JDK7及之前方法区的实现堆内内存JDK8后替换为元空间本地内存。虚拟机栈核心线程私有存储方法栈帧局部变量、执行状态和堆无交集随线程生灭不会被GC回收。大对象特征占用连续内存大直接进老年代避免新生代频繁拷贝是Full GC的潜在触发因素。这些概念的核心都是为了优化JVM内存管理效率堆分代减少GC耗时大对象直接进老年代避免拷贝虚拟机栈随线程销毁释放内存方法区存储类元数据支撑类加载和执行。原文链接 https://1024bat.cn/article/61来源 淘书1024bat

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询