[Java-jvm] 内存管理
2026年4月1日大约 2 分钟
[Java-jvm] 内存管理
JVM的内存结构介绍一下
注意
JMM 和 JVM内存结构是两个不同的概念。
- 线程私有:程序计数器、虚拟机栈、本地方法栈。
- 线程共享:堆、方法区。
什么是程序计数器?
可以看作是当前线程所执行的字节码的行号指示器。
介绍一下java虚拟机栈
每个方法在执行时都会创建一个栈帧,存储局部变量、操作数栈、动态链接和方法出口等信息。
栈帧会在方法调用时入栈,方法返回时出栈。
- 其特点在于:线程私有、生命周期与线程相同。
介绍一下本地方法栈
本地方法栈与虚拟机栈类似,但它为虚拟机使用到的本地方法服务。
扩展-什么是native方法
native方法是用于调用非Java代码的方法。可以通过JNI(Java Native Interface)实现与底层交互。
介绍一下 Java 堆
堆是JVM最大的一块内存区域,被所有线程共享,用于存放对象实例。
- 堆是垃圾回收器管理的主要区域
因此从内存回收的角度看,堆可以细分为新生代和老年代。
- 新生代(Young Generation):存放新创建的对象。又可以细分为 Eden、To Survivor 和 From Survivor 区域。
- 老年代(Old Generation):存放长时间存活的对象。
堆和栈的区别
- 堆属于线程共享的内存区域,存储对象实例,其生命周期由垃圾回收器管理。
- 栈属于线程私有的内存区域,存储方法调用的局部变量和操作数等信息,一般方法调用结束后自动释放。
介绍一下方法区
方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码缓存等数据
- JDK8 以前被称为“永久代”,是堆的一部分。
- JDK8 开始被称为“元空间”,使用本地内存,不在受堆大小限制。
重点- 对象创建的过程了解吗?
当实例化一个对象时,JVM会经历以下几个步骤:
- 类加载检查:检查类是否已经被加载,如果没有则加载类。
- 分配内存:在堆上为对象分配内存空间。
- 对象内存初始化:将对象的成员变量初始化为默认值。
- 设置对象头:为对象设置对象头信息,包括类指针和一些标志位。
- 执行构造方法:调用对象的构造方法进行初始化。
对象的销毁过程了解吗?
对象的销毁过程主要由垃圾回收器负责。当一个对象不再被任何引用所指向时,垃圾回收器会将其标记为可回收,并在适当的时候回收。