深度解析FramePack:高效视频扩散模型实战指南与架构设计
2026/6/22 4:21:04
在中文语境里,“JVM 内存模型”有两种常见指代:
1)JVM 运行时数据区(HotSpot 里的堆、栈、元空间等),偏“内存结构”;
2)Java Memory Model(JMM)(可见性/有序性/原子性规则),偏“并发语义”。
这份文档把两者都讲清楚,并给出排障与调优落地方法。
┌─────────────── 线程私有 ────────────────┐ Java 线程 ───▶ │ 程序计数器 PC │ 虚拟机栈 │ 本地方法栈 │ └────────────────────────────────────────┘ │ ▼ ┌────────────── 线程共享 ───────────────┐ │ 堆 Heap │ │ (新生代/老年代/对象分配/GC 等) │ └───────────────────────────────────────┘ │ ▼ ┌────────────── 线程共享 ───────────────┐ │ 方法区 / 元空间 Metaspace │ │ (类元数据、常量池、方法字节码等) │ └───────────────────────────────────────┘ 另外:直接内存 Direct Memory(NIO/堆外),不属于运行时数据区但非常重要。StackOverflowError:递归太深/栈帧过大导致栈空间耗尽。OutOfMemoryError: unable to create new native thread:线程太多或单个线程栈太大导致无法再创建线程(本质是 OS 资源/地址空间不足)。-Xss控制每个线程栈大小实战经验:线上“线程爆炸”时,盲目把
-Xss调太大很容易把问题放大(因为每个线程占用更多内存)。
StackOverflowError或 OOM(不同 JVM 实现表现略有差异)。堆是 GC 主要工作区域,也是对象的主要分配地。
JDK 21+(或不同 GC)分代实现细节有差异,但“短命对象多、长命对象少”的假设仍然成立。
OutOfMemoryError: PermGen spaceOutOfMemoryError: Metaspace-XX:MaxMetaspaceSize(上限)-XX:MetaspaceSize(触发 GC 的阈值之一)ByteBuffer.allocateDirectOutOfMemoryError: Direct buffer memory-XX:MaxDirectMemorySize(若未设置,通常与-Xmx相关联,具体行为依 JVM 实现而定)这也是为什么“加一个 boolean 字段不一定只多 1 字节”的原因:对齐与对象头占比会影响最终大小。
常见 GC Roots:
对象从 Roots 可达 → 存活;不可达 → 可回收(可能经历一次 finalize 复活,但不建议依赖)。
建议:生产环境至少打开 GC 日志,并把日志输出到文件(避免 STDOUT 影响容器/日志采集)。
JMM 解决的问题不是“内存怎么分区”,而是:
这解释了为什么“你在一个线程里改了变量,另一个线程不一定马上看到”。
int赋值)通常是原子的i++不是原子操作(读-改-写三步)volatile、synchronized、final(正确发布)可以提供可见性保障理解为:如果 A happens-before B,那么 A 的结果对 B 可见,且 A 的执行顺序排在 B 之前(在 JMM 意义上)。
常用规则:
Thread.start()hb 线程内动作;线程内动作 hbThread.join()返回volatile 提供:
volatile 不提供:
count++仍然不安全)适用场景:
volatile(避免重排序导致半初始化对象可见)java.util.concurrent.locks:一个经典例子:发布逸出(unsafe publication)
解决:
final字段、静态初始化、volatile 引用、加锁发布等。OutOfMemoryError: Java heap spaceOutOfMemoryError: MetaspaceOutOfMemoryError: Direct buffer memoryunable to create new native threadjcmd <pid> VM.flags/VM.system_propertiesjcmd <pid> GC.heap_info/GC.class_histogramjstat -gcutil <pid> 1sjmap -dump:format=b,file=heap.hprof <pid>(大堆会卡顿,慎用)jstack <pid>(线程死锁/阻塞/线程爆炸)i++为什么不是原子?count++?