JVM (一)--运行整体流程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/FJJ543/article/details/82107888

面试:面试被问到JVM,竟然对JVM这几个字母没反应过来,后面也就答了JVM的内存管理和GC算法,答得模棱两可。

写给自己:JVM一直都是Java中很重要基础知识,是面试中必问的知识点。如果连JVM都弄不清楚,还谈什么Java开发。

运行流程

Java语言宣称:一次编译,到处运行

实现如下:

1)Java程序经过一次编译后,将Java代码编译为字节码文件(.class文件);

2)然后在不同的操作系统下依靠不同的JVM进行解释;

3)最后再转换为不同平台的机器码,最终得到执行。

下面看看一个普通的Java程序执行流程:

public class HelloWorld {

        public static void main(String[] args) {

                  System.out.println("Hello world");

         }

}

这段HelloWorld程序从编译到运行,到最终打印出“Hello World”,中间经过的步骤:

1)Java程序代码通过编译后生成字节码文件(.class文件);

2)通过Java HelloWorld执行,此时根据系统版本找到jvm.cfg并加载;

3)根据配置文件(jvm.cfg)找到jvm.dll,jvm.dll是jvm的主要实现;

4)接下来初始化jvm,获取JNI接口,JNI是java本地接口,用于找到.class文件并装载到jvm里;

5)最后找到main方法并执行。

内存空间

方法区:各个线程的共享区域,存放类信息、常量、静态变量。

Java堆:各个线程的共享区域,存放类实例。一个系统会产生很多类实例,所有Java堆的空间也是最大的。

如果Java堆空间不足,程序将会抛出OutOfMemoryError异常。

Java栈:每个线程的私有区域,Java栈的生命周期和线程的生命周期相同,一个线程对应一个Java栈;

每执行一个方法,就会往栈中压入一个元素,这个元素叫“栈帧”,而“栈帧”中保存了方法中的局部变量、用于存放中间状态值的操作栈等。如果栈空间不足,程序抛出StackOverflowError异常。这是因为递归太深,执行大量方法,Java栈空间太大。

本地方法栈:本地方法栈的角色和Java栈类似,只不过本地方法栈是用来表示执行本地方法的,本地方法栈保存的方法调用本地方法接口,最终调用本地方法库,实现与操作系统、硬件交互的目的。

PC寄存器(程序计数器):控制程序指令在执行(调配指令顺序)。

类加载完后,实例对象(Java堆)、方法(Java栈)、静态变量(方法区)都已经存放在对应的内存空间,此时就需要PC寄存器(程序计数器)来控制程序指令的执行了。

执行引擎:执行指令。

               

猜你喜欢

转载自blog.csdn.net/FJJ543/article/details/82107888
今日推荐