JVM(1):java程序是怎么跑起来的

谈一个话题,我们写了那么多的java程序,他是怎么运行的呢?

先看这个流程图

JVM(1):java程序是怎么跑起来的_第1张图片

第一步:“.java”文件进行编译打包成jar包里的“.class”文件

第二步:利用"类加载器"进行加载“.class”文件,把“.class”字节码文件加载到JVM内存中供后续使用。

第三步:JVM基于自己的字节码执行引擎,来执行加载到JVM内存中已经写好的那些类。

那么,什么是类加载器呢?


类加载器

类加载器是分层级的,遵循双亲委派机制

  • 虚拟机自带的加载器
  • 最上层是Bootstrap ClassLoder,加载java的核心类库,加载java安装目录下的lib目录的class文件
  • 第二层是Ext ClassLoder,加载一些java的其他类库,加载java安装目录下的lib/ext目录下的class
  • 第三层是Application ClassLoder ,应该程序类加载器,这个类加载器是加载我们写的类
  • 自定义类加载器

双亲委派机制:

类加载器收到加载类的请求,将这个请求托付给上层类加载器进行加载,启动类加载器检查是否能够成功加载当前这个类,能加载就结束,不能加载就抛出异常,通知子类加载器进行加载。

简而言之: 爸爸干得了就爸爸干,爸爸干不了再儿子干


类加载的过程

什么情况下会触发类的加载?

​ 答案很简单,当我们代码中用到这个类的时候。

一个类从加载到使用,一般会经历以下过程:

准备阶段

  • 加载:类加载器将".class"文件加载进内存

  • 验证:检验加载到内存中的".class"文件是否完全符合JVM的规范,防止恶意篡改。

  • 准备:主要是给对象申请内存,然后给变量设置初始值。(注意,准备阶段只开辟空间,初始值0或者null)

  • 解析:主要是给符号引用变成直接引用,意思是把一些变量符号改为计算机物理地址。

核心阶段

  • 初始化:给准备阶段的变量赋值,准备阶段只是开辟了空间,设置初始值,优先加载父类。

你可能感兴趣的:(JVM,jvm,java)