参考文档:https://www.cnblogs.com/zhanglei93/p/6590609.html
一.Java虚拟机的工作原理:
1.首先Java源文件经过前端编译器(javac或ECJ)将.java文件编译为Java字节码文件
2.然后JRE(类加载器)加载Java字节码文件,载入系统分配给JVM的内存区,
3. 虚拟机中的执行引擎用来执行class文件中的字节码指令,将字节码转化为机器码与操作平台交互。
4.虚拟机在执行过程中,要分配内存创建对象。
5.当这些对象过时无用了,由垃圾收集器负责回收。
二.内存分配
JVM运行时数据区(JVM Runtime Area) 其实就是指JVM在运行期间,其对计算机内存空间的划分和分配。
程序计数器 和 虚拟机栈 ,本地方法栈 是 线程私有的 生命周期与线程相同
堆区 ,方法区 是线程共享的
1.程序计数器
一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。
字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令
2.虚拟机栈
虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行时都会创建一个栈帧用于存储
局部变量表 、操作数栈 、动态链接 、方法出口 等信息。
每个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
3.本地方法栈
本地方法栈则为虚拟机使用到的 Native 方法服务 (非java语言实现)
java 虚拟机栈为虚拟机执行 Java 方法 服务
4.Java堆
该区域的唯一目的就是存放对象实例和数组
内部会划分出多个线程私有的分配缓冲区 (防止多线程安全问题)
5.方法区
存储已被虚拟机加载的 类信息 、常量 、静态变量 、即时编译器编译后的代码等数据。
包含 常量池,用于存放编译期生成的各种字面量和符号引用