Java 内存图主要涉及到 Java 内存模型和 JVM 内存结构。
1. 堆(Heap)
- 功能:存储对象和数组。
- 特点:在 JVM 启动时分配,大小可以在启动时指定。垃圾回收器会管理堆内存,清理不再使用的对象。
- !!!凡是new出来的东西,都在堆当中。!!!
2. 栈(Stack)
- 功能:存储方法调用的局部变量、方法调用帧和控制信息。
- 特点:每个线程有自己的栈空间。栈内存管理是自动的,方法调用时分配,返回时释放。
- !!!!!方法的运行一定要在栈当中。!!!
3. 方法区(Method Area)
- 功能:存储类的元数据、方法数据和常量池。
- 特点:各线程共享,存放类结构信息,如字段和方法数据。
4. 常量池(Constant Pool)
- 功能:存储编译时生成的字面量和符号引用。
- 特点:用于优化内存使用,如字符串常量池,避免重复创建相同的字符串对象。
5. 程序计数器(Program Counter Register)
- 功能:跟踪当前线程正在执行的字节码的地址。
- 特点:每个线程都有一个独立的程序计数器,线程切换时保存和恢复状态。
6. 本地方法栈(Native Method Stack)
- 功能:存储调用本地(如 C/C++)方法的相关数据。
- 特点:与 Java 栈类似,但用于管理与 Java 本地接口的交互。
7. 垃圾回收(Garbage Collection)
- 功能:自动回收不再使用的对象,释放内存。
- 特点:包括不同的回收算法,如标记-清除、复制、标记-整理等。常见的垃圾回收器有 G1、CMS 和 Parallel GC。
8. 内存模型
- 功能:定义 Java 内存访问规则和线程间交互。
- 特点:包括可见性、原子性和有序性。使用
volatile
关键字和同步机制来保证线程安全。
9. JVM 参数
- 功能:用于控制内存分配和垃圾回收行为。
- 示例:
-Xmx
(最大堆大小)、-Xms
(初始堆大小)、-XX:MaxPermSize
(方法区大小)。