不同java程序 jvm_这大概是一篇最简单清晰的Java JVM执行流程

本人长期分享原创java文章,分享进阶架构师学习之心得体会,如觉有收获,烦请收藏关注!

一、JVM的体系结构

02c55f95c6e734fd01b940e6fe9aa48b.png

类装载系统

1、定位和导入二进制class文件

2、验证导入类的正确性

3、为类分配初始化内存

4、帮助解析符号引用

执行引擎

执行包在装载类的方法中的指令,也就是方法

运行区数据

虚拟机会在整个计算机内存中开辟一块内存存储JVM需要用到的对象,变量等,运行区数据有分很多小区,分别为:方法区,虚拟机栈,本地方法栈,堆,程序计数器。

GC

垃圾回收器,是负责回收内存中无用的对象,就是这些对象没有任何引用了,它就会被视为垃圾,也就会被删除。

二、类在JVM的执行流程

那么类在JVM的执行流程是怎么做的呢?共有三步:加载、链接和初始化。

加载

JVM将java类的二进制形式加载到内存中,并将他缓存在内存中,以便后面使用,如果没有找到指定的类就会抛出异常classNotFound,进程在这里结束。没有错误就继续在Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区域数据的访问入口。

链接

这个阶段做三件事:验证、准备和解析(可选)。

验证是JVM根据java语言和JVM的语义要求检查这个二进制形式。例如,如果篡改经过编译后的类文件,那么这个类文件可能就不能使用了。

准备是指准备要执行的指定的类,准备阶段为变量分配内存并设置静态变量的初始化。在这个阶段分配的仅为类的变量(static修饰的变量),而不包括类的实例变量。对非final的变量,JVM会将其设置成“零值”,而不是其赋值语句的值:

public static int num = 8;

那么在这个阶段,num的值为0,而不是8。 final修饰的类变量将会赋值成真实的值。

解析是检查指定的类是否引用了其他的类/接口,是否能找到和加载其他的类/接口。这些检查将针对被引用的类/接口递归进行,JVM的实施也可以在后面阶段执行解析,即正在执行的代码真正要使用被引用的类/接口的时候。

初始化

在这最后一步中,JVM用赋值或者缺省值将静态变量初始化,初始化发生在执行main方法之前。在指定的类初始化前,会先初始化它的父类,此外,在初始化父类时,父类的父类也要这样初始化。这个过程是递归进行的。

简而言之,整个流程是将类存进内存中,检查类的对应调用的类和接口是否可正常使用,再对类进行初始化的过程。

7b6f0c73931ebd06c856e920e0525b5e.png

类在JVM执行流程

三、Java代码编译和执行的整个过程

Java代码编译是由Java源码编译器来完成,流程图如下所示:

5923188f776a8d9a2221c5a17c041f2e.png

Java字节码的执行是由JVM执行引擎来完成,流程图如下所示:

448db62b84aed249e007f770fbb41eaa.png

四、总结

Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序。

程序开始执行时他才运行,程序结束时他就停止。你在同一台机器上运行三个程序,就会有三个运行中的Java虚拟机。

Java虚拟机总是开始于一个main()方法,这个方法必须是公有、返回void、直接受一个字符串数组。在程序执行时,你必须给Java虚拟机指明这个包换main()方法的类名。 Main()方法是程序的起点,他被执行的线程初始化为程序的初始线程。程序中其他的线程都由他来启动。

Java中的线程分为两种:守护线程(daemon)和普通线程(non-daemon)。守护线程是Java虚拟机自己使用的线程,比如负责垃圾收集的线程就是一个守护线程。当然,你也可 以把自己的程序设置为守护线程。包含Main()方法的初始线程不是守护线程。

只要Java虚拟机中还有普通的线程在执行,Java虚拟机就不会停止。如果有足够的权限,你可以调用exit()方法终止程序。

已完结专题(关注后查看):

【mysql优化专题】【HTTP协议】【架构技术专题】【多线程/池专题】

更新中专题(关注后查看):

【dubbo专题】【dubbo源码专题】

【JVM专题】【HTTP协议专题】

【设计模式专题】【高并发专题】

【架构技术专题】【netty专题】

【数据结构专题】【redis专题】

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值