Jvm的运行过程

1,Java的运行过程: 编译》加载》运行

2,

类加载主要是由jvm虚拟机负责的,过程非常复杂,

类加载分三步 加载 》 连接 》初始化,

(这里的加载和本文标题的类加载是不同的,标题的类加载包含了完整的三个步骤)

下面详细说说每一步的过程

2.1、加载:

这个很简单,程序运行之前jvm会把编译完成的.class二进制文件加载到内存,

供程序使用,用到的就是类加载器classLoader ,这里也可以看出java程序的运行并不是

直接依靠底层的操作系统,而是基于jvm虚拟机。如果没有类加载器,java文件就只是磁盘中的一个普通文件。

2.2、连接:

连接是很重要的一步,过程比较复杂,分为三步 验证 》准备 》解析   

  验证:确保类加载的正确性。一般情况由javac编译的class文件是不会有问题的,

但是可能有人的class文件是自己通过其他方式编译出来的,这就很有可能不符合jvm的编 译规则,

这一步就是要过滤掉这部分不合法文件 

 

  准备:为类的静态变量分配内存,将其初始化为默认值 。我们都知道静态变量是可以不用我们手动赋值的,

它自然会有一个初始值 比如int 类型的初始值就是0 ;boolean类型初始值为false,

引用类型的初始值为null 。 这里注意,只是为静态变量分配内存,此时是没有对象实例的 

  解析:把类中的符号引用转化为直接引用。解释一下符号引用和直接引用。

比如在方法A中使用方法B,A(){B();},这里的B()就是符号引用,

初学java时我们都是知道这是java的引用,以为B指向B方法的内存地址,

但是这是不完整的,这里的B只是一个符号引用,它对于方法的调用没有太多的实际意义,

可以这么认为,他就是给程序员看的一个标志,让程序员知道,这个方法可以这么调用,

但是B方法实际调用时是通过一个指针指向B方法的内存地址,这个指针才是真正负责方法调用,

他就是直接引用。

2.3、初始化:

为类的静态变量赋予正确的初始值,上述的准备阶段为静态变量赋予的是虚拟机默认的初始值,

此处赋予的才是程序编写者为变量分配的真正的初始值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

、小H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值