JVM之java程序编译和运行的过程 您所在的位置:网站首页 java程序的运行过程 JVM之java程序编译和运行的过程

JVM之java程序编译和运行的过程

2023-05-14 09:01| 来源: 网络整理| 查看: 265

Java应用程序的开发周期包括编译、下载 、解释和执行几个部分。简单来说,Java代码的编译和执行的整个过程大概是:开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件),再然后字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的转换成机器码执行。

Java程序从源文件创建到程序运行要经过两大步骤: 1、源文件由编译器编译成字节码(ByteCode) 2、字节码由java虚拟机解释运行。 因为java程序既要编译也要经过JVM的解释运行,所以说Java被称为半解释语言.

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

JVM之java程序编译和运行的过程-yellowcong_Java

  刚开始学习java的时候,我们并没有用到IDE编辑器,我们先是使用 javac Demo.java编译,然后 使用java Demo执行程序,java编译过程中,需要经过1、分析和输入到符号表,2、注解处理(.class文件中,所有的注解都被清空),3、语义分析和生成class文件

   生成的class文件中,最后生成的class文件由以下部分组成:

结构信息。包括class文件格式版本号及各部分的数量与大小的信息 元数据。对应于Java源码中声明与常量的信息。包含类/继承的超类/实现的接口的声明信息、域与方法声明信息和常量池 方法信息。对应Java源码中语句和表达式对应的信息。包含字节码、异常处理器表、求值栈与局部变量区大小、求值栈的类型记录、调试符号信息

JVM之java程序编译和运行的过程-yellowcong_Java_02

JVM

JVM之java程序编译和运行的过程-yellowcong_System_03

JVM之java程序编译和运行的过程-yellowcong_加载器_04

类加载机制   在JVM中,最后的文件都是Class文件,也就是字节码文件,因此需要把该文件加载到JVM中才能运行。而加载的过程,只会执行静态代码块。   类加载器分为三种:BootStrapClassLoader加载器,ExtensionClassLoader标准扩展加载器,AppClassLoader系统类加载器。   在Java中,类的加载使用了双亲委托模型,简单来讲,子类的类加载器找不到,就会找父类的加载器,就这样一级一级的找,最好找到了BootStrapClassLoader类加载器,这个BootStrapClassLoader是用C语言写的,所以它是没有父类的,

JVM之java程序编译和运行的过程-yellowcong_加载器_05

  下面是测试例子,会发现各自的类加载路径以及加载器的名称,到了最后的BootStrapClassLoader,发现没有父类加载器了,因为这已经到头了,所以返回NULL

package com.yellowcong.test; public class Demo { public static void main(String[] args) { //类加载器的设计,使用的是双亲委托模型 //SystemClassLoader系统类加载器 ClassLoader classLoader = Demo.class.getClassLoader(); System.out.println(classLoader); //AppClassLoader和ExtensionClassLoader 两个都没有类加载器,就会找上一级的加载器 System.out.println(classLoader.getClass().getClassLoader()); //AppClassLoader加载的class System.out.println(System.getProperty("java.class.path")); //ExtensionClassLoader标准扩展加载器 ClassLoader extClassLoader = classLoader.getParent(); System.out.println(extClassLoader); System.out.println(extClassLoader.getClass().getClassLoader()); System.out.println(System.getProperty("java.ext.dirs")); //引导类加载器,这个BootStrapClassLoader加载器使用的是C语言写的所以找不到 ClassLoader bootStrapClassLoader = extClassLoader.getParent(); System.out.println(bootStrapClassLoader); System.out.println(System.getProperty("sun.boot.class.path")); } }


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有