<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>字节码 on PlumePHP</title><link>https://plumephp.com/tags/%E5%AD%97%E8%8A%82%E7%A0%81/</link><description>Recent content in 字节码 on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Thu, 13 Aug 2026 09:03:00 +0800</lastBuildDate><atom:link href="https://plumephp.com/tags/%E5%AD%97%E8%8A%82%E7%A0%81/index.xml" rel="self" type="application/rss+xml"/><item><title>03. JVM 内存模型与类加载机制</title><link>https://plumephp.com/java-jvm-internals/</link><pubDate>Thu, 13 Aug 2026 09:03:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-internals/</guid><description>&lt;p&gt;JVM 是 Java 生态的基石。理解其内存布局、类加载机制与执行引擎，不仅是性能调优的前提，更是排查 OOM、类冲突、类泄露等疑难杂症的必备技能。&lt;/p&gt;
&lt;h2 id="1-jvm-运行时数据区总览"&gt;1. JVM 运行时数据区总览&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────┐
│ JVM Runtime │
├─────────────────────────────────────────────────────┤
│ 线程私有（随线程生灭） │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ PC 寄存器 │ │ 虚拟机栈 │ │ 本地方法栈 │ │
│ │ (计数指令) │ │ (Stack) │ │ (Native) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
├─────────────────────────────────────────────────────┤
│ 线程共享（所有线程可见） │
│ ┌─────────────────────────────────────────────┐ │
│ │ 堆 (Heap) │ │
│ │ ┌─────────────┐ ┌──────────────────────┐│ │
│ │ │ 年轻代 │ │ 老年代 ││ │
│ │ │ Eden / S0/S1│ │ (Old Gen) ││ │
│ │ └─────────────┘ └──────────────────────┘│ │
│ └─────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────┐ │
│ │ 元空间 (Metaspace, Java 8+) │ │
│ │ 类元数据 / 方法元数据 / 常量池 / 符号引用 │ │
│ └─────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────┤
│ 直接内存（堆外） │
│ ┌─────────────────────────────────────────────┐ │
│ │ 直接堆外内存 (Direct Buffer / Unsafe.allocate) │ │
│ └─────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="11-各区域详解"&gt;1.1 各区域详解&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;区域&lt;/th&gt;
					&lt;th&gt;用途&lt;/th&gt;
					&lt;th&gt;异常&lt;/th&gt;
					&lt;th&gt;参数&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;PC 寄存器&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;当前线程执行字节码行号&lt;/td&gt;
					&lt;td&gt;无（Native 方法时为 Undefined）&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;虚拟机栈&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;方法调用栈帧（局部变量、操作数栈、动态链接、返回地址）&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;StackOverflowError&lt;/code&gt; / &lt;code&gt;OutOfMemoryError&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;-Xss&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;本地方法栈&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Native 方法调用&lt;/td&gt;
					&lt;td&gt;同上&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;堆&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;对象实例与数组&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;OutOfMemoryError: Java heap space&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;-Xms&lt;/code&gt; / &lt;code&gt;-Xmx&lt;/code&gt; / &lt;code&gt;-Xmn&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;元空间&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;类元数据（Java 8+ 替代永久代）&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;OutOfMemoryError: Metaspace&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;-XX:MaxMetaspaceSize&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;直接内存&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;NIO 缓冲区、Netty 等&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;OutOfMemoryError: Direct buffer memory&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;-XX:MaxDirectMemorySize&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="12-堆对象分配与晋升"&gt;1.2 堆：对象分配与晋升&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;新对象 → Eden 区
 ├─ Minor GC 后存活 → Survivor 区 (S0 或 S1)
 │ ├─ 交替复制到另一 Survivor
 │ └─ 每经历一次 Minor GC，年龄 +1
 │ └─ 年龄 ≥ -XX:MaxTenuringThreshold 或 Survivor 50% 同龄对象 → 晋升老年代
 └─ 大对象（-XX:PretenureSizeThreshold） → 直接分配老年代

-XX:TargetSurvivorRatio = 50 (Survivor 目标使用率)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;空间分配担保&lt;/strong&gt;：Minor GC 前检查老年代最大连续空间是否大于新生代所有对象总空间；否则查看 &lt;code&gt;HandlePromotionFailure&lt;/code&gt;。JDK 6u24 后此参数废弃，默认开启。&lt;/p&gt;</description></item></channel></rss>