JVM内存模型
加载机制: 加载 -> 连接(验证 -> 准备 -> 解析) -> 初始化 -> 使用 -> 卸载
Java文件通过 javac 编译为字节码文件,在通过 java 命令运行(Java虚拟机开始工作)。
首先通过 类装载子系统 把字节码文件加载到 运行时数据区,并分配内存,最终用 字节码执行引擎 来运行运行时数据区的代码。
上面图中名称解释:
- 类加载器(ClassLoader):在JVM启动时或者在类运行时将需要的class加载到JVM中。
- 字节码执行引擎:负责执行class文件中包含的字节码指令。
-
内存区(也叫运行时数据区):是在JVM运行的时候操作所分配的内存区。
- java堆(Heap): 存放new创建的对象和数组。这块是GC的主要区域。
-
java栈(Stack): 存放局部变量(基本类型变量和对象的引用变量)。
栈总是和线程关联在一起,每当创建一个线程时,JVM就会为这个线程创建一个对应的java栈。
在这个java栈中又会包含多个栈帧,每运行一个方法就创建一个栈帧,用于存储局部变量表、操作栈、方法返回值等。
每一个方法从调用直至执行完成的过程,就对应一个栈帧在java栈中入栈到出栈的过程。所以java栈是现成私有的。 -
程序计数器(PC Register): 用于保存当前线程执行的内存地址。
由于JVM程序是多线程执行的(线程轮流切换),所以为了保证线程切换回来后,还能恢复到原先状态,就需要一个独立的计数器,记录之前中断的地方,可见程序计数器也是线程私有的。 - 本地方法栈(Native Method Stack):和java栈的作用差不多,只不过是为JVM使用到的Native方法服务( java 调用非 java 代码的接口,该方法并非 Java 实现的,可能由 C 或 Python等其他语言实现的)。