网站用户访问统计php网站开发招聘需求分析
2026/5/21 15:17:56 网站建设 项目流程
网站用户访问统计,php网站开发招聘需求分析,南宁微信网站建设,做网站的的价格JVM 内存结构 对象分配详解#xff08;HotSpot 虚拟机#xff0c;JDK 8 ~ 21 主流版本#xff09; 下面内容基于 HotSpot JVM#xff08;Oracle/OpenJDK 默认实现#xff09;#xff0c;2025–2026 年主流生产环境基本没有大变化#xff08;PermGen 已彻底移除#x…JVM 内存结构 对象分配详解HotSpot 虚拟机JDK 8 ~ 21 主流版本下面内容基于 HotSpot JVMOracle/OpenJDK 默认实现2025–2026 年主流生产环境基本没有大变化PermGen 已彻底移除Metaspace 仍是常态。一、JVM 运行时数据区整体划分线程共享 vs 线程私有JVM 内存主要分为以下几个逻辑区域区域名称是否线程共享生命周期主要存储内容可能抛出的 OOM 异常是否会 GC程序计数器 (PC Register)私有线程生命周期当前线程执行的字节码指令地址分支、循环、异常跳转等几乎不会 OOM否Java 虚拟机栈 (VM Stack)私有线程生命周期栈帧局部变量表、操作数栈、动态链接、方法出口等StackOverflowError / OOM否本地方法栈 (Native Method Stack)私有线程生命周期native 方法JNI 调用 C/C的栈帧StackOverflowError / OOM否Java 堆 (Heap)共享JVM 启动 ~ 关闭几乎所有对象实例、数组OutOfMemoryError: Java heap space是重点 GC 区域元空间 (Metaspace)共享JVM 启动 ~ 关闭类元数据、方法字节码、常量池、符号引用、注解等OutOfMemoryError: Metaspace是Full GC 时可能回收直接内存 (Direct Memory)——NIO ByteBuffer.allocateDirect() 分配的 off-heap 内存OutOfMemoryError: Direct buffer memory否手动或 GC 间接回收最核心一句话记忆线程私有程序计数器 虚拟机栈 本地方法栈每个线程一份互不干扰线程共享堆 元空间所有线程可见GC 主要发生在这里二、HotSpot JVM 堆内存详细布局分代 G1 时代主流视图现代 HotSpotJDK 8默认使用分代思想但具体收集器不同物理布局有差异。1. 最经典的分代布局Parallel / CMS 时代常见Heap ├── Young Generation新生代 ≈ 1/3 heap │ ├── Eden伊甸园 ≈ 8/10 young │ └── Survivor幸存者区×2 From / To 各 ≈ 1/10 young └── Old Generation老年代 / 养老区 ≈ 2/3 heapEden几乎所有 new 对象最先在这里分配Survivor经过 Minor GC 后仍存活的对象进入这里复制算法默认比例 Eden:From:To 8:1:1Old经历多次 Minor GC 仍存活年龄阈值默认 15可调 -XX:MaxTenuringThreshold或大对象直接进入2. G1 收集器时代JDK 9 默认2025–2026 生产主流G1 已经取消严格的连续 Young/Old 区域而是把整个堆切成很多个Region默认 2048 个可调每个 Region 大小固定1MB ~ 32MB堆越大 Region 越大同一个时刻Region 可以动态扮演以下角色Eden RegionSurvivor RegionOld RegionHumongous Region超大对象 50% Region 大小Young GC 只回收 Eden Survivor RegionMixed GC 同时回收部分 Old RegionG1 内存布局示意逻辑分代物理碎片化Heap → 很多个 Region大小相等 ┌───────────────┐ │ Eden Regions │ ├───────────────┤ │ Survivor Regs │ ├───────────────┤ │ Old Regions │ ├───────────────┤ │ Humongous Reg │ ← 大对象专用 └───────────────┘三、Java 对象创建 内存分配全过程面试高频new 对象时 JVM 做了什么8 个步骤类加载检查遇到 new 指令 → 先检查常量池中是否有该类的符号引用 → 如果没有则触发类加载加载 → 链接 → 初始化分配内存核心步骤在堆中划出一块确定大小的内存给对象对象大小在类加载后已知。分配方式两种取决于堆是否规整方式适用收集器堆是否规整原理并发安全解决方案指针碰撞Serial / ParNew是指针向空闲端移动 size 距离TLAB线程本地分配缓冲空闲列表CMS / G1部分情况否从空闲列表中找一块足够大的空间CAS 失败重试TLABThread Local Allocation Buffer是 HotSpot 解决并发分配的优化每个线程在 Eden 预先申请一块私有缓冲区线程内分配直接在 TLAB 上指针碰撞无锁TLAB 用完再去 Eden 申请新的一块仍需同步初始化零值分配的内存空间对象头除外全部置为零值保证字段不赋初值也能用设置对象头Mark WordhashCode、GC 分代年龄、锁状态等Klass Pointer指向类元数据数组才有数组长度执行 方法构造器按照代码顺序执行父类构造 → 成员变量显式赋值 → 构造代码块 → 构造方法体四、对象分配的“特殊规则”面试加分项大对象直接进老年代-XX:PretenureSizeThreshold默认 0大于这个值的对象直接分配到老年代避免在 Survivor 来回复制动态年龄判定Survivor 区晋升老年代规则如果 Survivor 空间中相同年龄的所有对象大小总和 Survivor 空间的一半默认 50%-XX:TargetSurvivorRatio年龄 该年龄的对象直接晋升老年代长期存活的对象进入老年代默认经历 15 次 Minor GC 后晋升-XX:MaxTenuringThreshold15空间分配担保Minor GC 前老年代最大可用连续空间 新生代所有对象总大小 → 提前 Full GC五、快速记忆口诀面试背诵版内存结构口诀“程栈本堆元私私私共共”程序计数器、虚拟机栈、本地方法栈私有堆、元空间共享堆内布局口诀分代时代“新生伊甸幸存俩老年养老养老家”对象分配口诀“先查类加载 → 指针碰撞或空闲列表 → TLAB 加速 → 零值填充 → 对象头 → 构造执行”晋升老年代三板斧大 → 直接老老 → 年龄阈值默认 15多 → 动态年龄判定同龄 Survivor/2希望这篇能让你对 JVM 内存结构 对象分配有清晰的整体认知。下一期想看哪个方向GC 算法详解Serial / Parallel / CMS / G1 / ZGC / ShenandoahOOM 常见场景 定位思路常用 JVM 参数实战调优对象头 MarkWord 详细位图随时告诉我

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

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

立即咨询