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

本文详细介绍了JVM的运行流程,包括Java程序如何编译成字节码并由JVM解释执行,以及Java程序执行过程中涉及的JVM组件,如JVM.dll、JNI接口和类加载。同时,文章还剖析了JVM的内存空间,包括方法区、Java堆、Java栈、本地方法栈和PC寄存器的作用和它们在程序运行中的关键角色。通过对这些基础知识的理解,有助于提升Java开发者对JVM和程序运行机制的认识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面试:面试被问到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寄存器(程序计数器)来控制程序指令的执行了。

执行引擎:执行指令。

               

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值