JVM之java程序编译和运行的过程-yellowcong
Java应用程序的开发周期包括编译、下载 、解释和执行几个部分。简单来说,Java代码的编译和执行的整个过程大概是:开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件),再然后字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的转换成机器码执行。
·
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源码中语句和表达式对应的信息。包含字节码、异常处理器表、求值栈与局部变量区大小、求值栈的类型记录、调试符号信息
JVM |
类加载机制 |
在JVM中,最后的文件都是Class文件,也就是字节码文件,因此需要把该文件加载到JVM中才能运行。而加载的过程,只会执行静态代码块。
类加载器分为三种:BootStrapClassLoader加载器,ExtensionClassLoader标准扩展加载器,AppClassLoader系统类加载器。
在Java中,类的加载使用了双亲委托模型,简单来讲,子类的类加载器找不到,就会找父类的加载器,就这样一级一级的找,最好找到了BootStrapClassLoader类加载器,这个BootStrapClassLoader是用C语言写的,所以它是没有父类的,
下面是测试例子,会发现各自的类加载路径以及加载器的名称,到了最后的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"));
}
}
更多推荐
已为社区贡献13条内容
所有评论(0)