JVM之java程序编译和运行的过程 | 您所在的位置:网站首页 › java程序的运行过程 › JVM之java程序编译和运行的过程 |
Java应用程序的开发周期包括编译、下载 、解释和执行几个部分。简单来说,Java代码的编译和执行的整个过程大概是:开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件),再然后字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的转换成机器码执行。 Java程序从源文件创建到程序运行要经过两大步骤: 1、源文件由编译器编译成字节码(ByteCode) 2、字节码由java虚拟机解释运行。 因为java程序既要编译也要经过JVM的解释运行,所以说Java被称为半解释语言. 编译class Java代码编译是由Java源码编译器来完成,流程图如下所示:刚开始学习java的时候,我们并没有用到IDE编辑器,我们先是使用 javac Demo.java编译,然后 使用java Demo执行程序,java编译过程中,需要经过1、分析和输入到符号表,2、注解处理(.class文件中,所有的注解都被清空),3、语义分析和生成class文件 生成的class文件中,最后生成的class文件由以下部分组成: 结构信息。包括class文件格式版本号及各部分的数量与大小的信息 元数据。对应于Java源码中声明与常量的信息。包含类/继承的超类/实现的接口的声明信息、域与方法声明信息和常量池 方法信息。对应Java源码中语句和表达式对应的信息。包含字节码、异常处理器表、求值栈与局部变量区大小、求值栈的类型记录、调试符号信息下面是测试例子,会发现各自的类加载路径以及加载器的名称,到了最后的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 实验室设备网 版权所有 |