转自:https://blog.csdn.net/u011015260/article/details/57416977

1运行流程
JVM运行流程和结构
整个流程是:

  1. 通过java xx命令进入jvm中

  2. 装载配置:根据当前的路径和系统版本寻找 jvm.cfg文件

  3. 根据配置文件寻找jvm.dll 文件:jvm.dll文件为JVM的主要实现

  4. 初始化JVM 得到JVM对应的接口和findClass等操作实现

  5. 找到main()方法进行操作运行。

.Java文件在执行时候先转化为 .class文件再在虚拟机之中进行执行。
JVM运行流程和结构
.Class文件在虚拟机之中的执行流程:

  1. Class文件通过类加载器子系统进入内存空间。

  2. Java堆,java栈进行操作(二进制操作)

  3. 调用本地方法库将执行结果输出

  4. 堆栈操作结束进行垃圾回收GC

由此可见JVM实现垃圾的自动回收机制,相对C++ 比较方便。

2.JVM结构
JVM的结构组成:
JVM运行流程和结构
上图可知JVM 包括:

  1. PC寄存器

  2. 垃圾回收器

  3. 方法区(方法区也被称为non-heap,非堆;又即GC分代垃圾收集中的持久代,Permanent Generation,PermGen)

  4. Java堆

  5. Java 栈

  6. 本地方法栈

PC寄存器

每个线程拥有一个PC寄存器

在线程创建时创建的

指向下一条指令的地址

执行本地方法时,PC的值为undefined

方法区

保存装载的类信息

1类型的常量池

2 字段,方法信息

3方法字节码

Java堆

和程序开发密切相关

1.应用系统对象都保存在Java堆中

2.所有线程共享Java堆 (公共区域)

3.对分代GC来说,堆也是分代的

4.GC的主要工作区间

Java栈

1.线程私有

2.栈由一系列帧组成(因此Java栈也叫做帧栈)

3.帧保存一个方法的局部变量、操作数栈、常量池指针

4.每一次方法调用创建一个帧,并压栈

JVM运行流程和结构

栈中包含:

  1. 局部变量表包含参数和局部变量(static 方法和 非static 方法 栈中位置区别)

  2. Java没有寄存器,所有参数传递使用操作数栈 。

在栈中的操作:

  1. a进栈 — 100 进栈中

  2. b进栈 — 98 进栈中

  3. 弹出两个变量求和,和压栈 –198进栈

  4. 弹出结果,放在局部变量2中 —– c=a+b;

  5. 局部变量2压栈 ——- c=198进栈

  6. 返回结果 ——— return c;

栈上分配

分配对象:

  1. 小对象(一般几十个bytes),在没有逃逸的情况下,可以直接分配在栈上

  2. 直接分配在栈上,可以自动回收,减轻GC压力

  3. 大对象或者逃逸对象无法栈上分配

JVM内存模型:

JVM运行流程和结构

  1. 主内存空间是共享空间

  2. 工作内存空间是私有的空间

  3. 线程工作内存与主内存之间数据更新有延迟

  4. Volatile可以实现工作内存与主内存之间的数据快速更新

JVM运行:

1.解释运行

– 解释执行以解释方式运行字节码

– 解释执行的意思是:读一句执行一句

2编译运行(JIT)

– 将字节码编译成机器码

– 直接执行机器码

– 运行时编译

– 编译后性能有数量级的提升

编译运行效率高于解释运行的效率。

相关文章: