目录
3. CMS收集器(Concurrent Mark Sweep)
引言
内存管理与垃圾回收(GC)是Java虚拟机(JVM)最核心的功能之一,也是Java开发者必须深入理解的关键技术。自动化的内存管理虽然解放了开发者手动管理内存的负担,但如果不了解其工作原理,很容易导致内存泄漏、性能下降等问题。本文将全面剖析JVM的内存管理机制和垃圾回收原理,帮助开发者编写更高效的Java代码。
一、JVM内存区域划分
1. 堆内存(Heap)
-
新生代(Young Generation)
-
Eden区:新对象首先分配在这里
-
Survivor区(From/To):存放从Eden区GC后存活的对象
-
-
老年代(Old Generation):存放长期存活的对象
-
元空间(Metaspace):Java 8+替代永久代(PermGen),存放类元数据
2. 非堆内存(Non-Heap)
-
虚拟机栈:线程私有,存储栈帧
-
本地方法栈:为本地方法服务
-
程序计数器:线程执行位置指示器
// 内存分配示例 public class MemoryAllocation { private static final int SIZE = 1024 * 1024; // 1MB public static void main(String[] args) { // 分配在Eden区 byte[] edenAlloc = new byte[2 * SIZE]; // 触发Minor GC,存活对象进入Survivor byte[] survivorAlloc = new byte[2 * SIZE]; // 大对象直接进入老年代 byte[] oldGenAlloc = new byte[8 * SIZE]; } }
二、对象生命周期与内存分配
1. 对象创建过程
-
类加载检查
-
内存分配(指针碰撞/空闲列表)
-
内存空间初始化
-
对象头设置
-
执行<init>方法
2. 对象访问定位
-
句柄访问:稳定,但访问速度较慢
-
直接指针:HotSpot采用的方式,访问速度快
3. 对象内存布局
-
对象头(Mark Word)
-
实例数据
-
对齐填充
三、垃圾回收算法
1. 标记-清除算法(Mark-Sweep)
-
优点:实现简单
-
缺点:产生内存碎片</