今天是2025/03/20 16:36 day 09
总路线请移步主页Java大纲相关文章
今天进行JVM前二个模块的归纳
首先是JVM的相关内容概括的思维导图
以下是针对思维导图中 内存管理 和 垃圾回收(GC) 模块的详细说明:
1. 内存管理(运行时数据区)
1.1 堆(Heap)
-
作用:存储对象实例和数组(所有线程共享)。
-
分区:
-
年轻代(Young Generation):新对象优先分配在此区域。
-
Eden区:对象初次分配的位置。
-
Survivor区(S0/S1):存放经过 Minor GC 后存活的对象,通过复制算法在两个 Survivor 区之间交替存活。
-
-
老年代(Old Generation):存放长期存活的对象(例如经历多次 Minor GC 后仍存活的对象)。
-
-
触发条件:
-
年轻代满时触发 Minor GC。
-
老年代满时触发 Major GC/Old GC。
-
1.2 方法区(Method Area)
-
作用:存储类元数据(类名、方法、字段等)、常量池(字面量、符号引用)、静态变量(JDK 8 后静态变量移至堆中)。
-
实现:
-
JDK 8 前:永久代(PermGen),受
-XX:PermSize
和-XX:MaxPermSize
控制。 -
JDK 8 后:元空间(Metaspace),使用本地内存,受
-XX:MetaspaceSize
和-XX:MaxMetaspaceSize
控制。
-
1.3 虚拟机栈(VM Stack)
-
作用:存储线程私有的方法调用栈帧(每个方法对应一个栈帧)。
-
栈帧内容:
-
局部变量表:存放方法参数和局部变量。
-
操作数栈:用于执行字节码指令的临时数据存储。
-
动态链接:指向方法所属类的运行时常量池引用。
-
方法返回地址:记录方法执行完成后的返回位置。
-
-
异常:栈深度超过
-Xss
设置值时,抛出StackOverflowError
。
1.4 本地方法栈(Native Stack)
-
作用:为 JVM 调用本地(Native)方法(如 C/C++ 代码)提供栈空间。
1.5 程序计数器(PC Register)
-
作用:记录当前线程执行字节码指令的位置(线程私有)。
-
特点:唯一不会发生 OOM 的区域。
2. 垃圾回收(GC)
2.1 分代收集策略
-
Minor GC:
-
目标:清理年轻代(Eden + Survivor)。
-
触发条件:Eden 区满。
-
存活对象处理:存活对象从 Eden 和 Survivor 复制到另一个 Survivor 区,年龄+1;年龄达到阈值(默认15)则晋升到老年代。
-
-
Major GC/Old GC:
-
目标:清理老年代(不同收集器行为不同,如 CMS 的并发回收)。
-
-
Full GC:
-
目标:清理整个堆和方法区。
-
触发条件:老年代不足、方法区不足、显式调用
System.gc()
等。
-
2.2 GC 算法
-
标记-清除(Mark-Sweep):
-
步骤:标记存活对象 → 清除未标记对象。
-
缺点:内存碎片化。
-
-
复制算法(Copying):
-
步骤:将存活对象复制到另一块内存区域,清空原区域。
-
优点:无碎片化;缺点:内存利用率低(适用于年轻代)。
-
-
标记-整理(Mark-Compact):
-
步骤:标记存活对象 → 向一端移动存活对象 → 清理边界外内存。
-
优点:无碎片化(适用于老年代)。
-
2.3 GC 收集器
-
Serial:
-
单线程,适用于客户端模式(如
-client
参数)。
-
-
Parallel(吞吐量优先):
-
多线程并行回收,关注吞吐量(如
-XX:+UseParallelGC
)。
-
-
CMS(低延迟):
-
并发标记清除,减少 STW 时间(已逐步被 G1 取代)。
-
缺点:内存碎片化、CPU 敏感。
-
-
G1(平衡型):
-
将堆划分为多个 Region,预测停顿时间进行回收(JDK 9+ 默认)。
-
适用场景:大堆、低延迟需求。
-
-
ZGC/Shenandoah(极致低延迟):
-
支持 TB 级堆,STW 时间控制在 10ms 以内(JDK 11+ 实验性功能)。
-
调优参数
-
GC 调优核心参数:
-
-Xmx
/-Xms
:堆最大/初始大小。 -
-XX:NewRatio
:老年代与年轻代的大小比例。 -
-XX:SurvivorRatio
:Eden 与单个 Survivor 区的比例。
-
-
GC 日志分析:
-
使用
-XX:+PrintGCDetails
输出详细 GC 日志。 -
工具:GCEasy、GCViewer 等可视化分析。
-