Java程序的执行过程

我们手工执行java程序是这样的:
1 在记事本中或者是UE的文本编辑器中,写好源程序;
2 使用javac命令把源程序编译成.class文件;
     编译后的.class(类字节码)文件中会包含以下内容:

ConstantPool:符号表;
FieldInfo:类中的成员变量信息;
MethodInfo:类中的方法描述;
Attribute:可选的附加节点。
FieldInfo节点包含成员变量的名称,诸如public,private,static等的标志。ConstantValue属性用来存储静态的不变的成员变量的值。Deprecated和Synthetic被用来标记一个成员变量是不被推荐的或由编译器生成的。

3 有了.class文件,我们执行 java 解释命令就可以运行java程序了。

现在我们主要讨论一下,当执行 java这个命令后,会发生什么事情呢?
首先,JVM装载.class,也就是类装载器装载类字节码。一个类装载器本身也是一个java类,所以,类装载器自身也需要被另外一个类装载器装载,这就出现了类似先有蛋,还是先有鸡的问题。但JAVA中的类装载器的这个问题却很容易解决。JAVA的虚拟机(JVM)中内嵌了一个称为Bootstrap类装载器,它是用特定于操作系统的本地代码实现的,属于JAVA虚拟机的内核,Bootstrap类不用专门的类装载器去进行装载。Bootstrap类负责加载JAVA核心包中的类(即rt.jar文件中的类),这些类的Class.getClassLoader()方法返回值为null,即表示是Bootstrap类装载器。JAVA核心包中有另外两个类装载器:ExtClassLoader和AppClassLoader,它们都是用JAVA语言编写的JAVA类,其中ExtClassLoader类装载负责加载存放在<JAVA_HOME>/jre/lib/ext目录下的jar包中的类,AppClassLoader负责加载应用程序的启动执行类,即当使用java命令去启动执行一个类时,JAVA虚拟机使用AppClassLoader加载这个类。在编译和运行JAVA程序时,都会通过ExtClassLoader类装载器去<JAVA_HOME>/jre/lib/ext目录下的JAR包中搜索要加载的类,所以,如果将包含例如Servlet API的jar包或者是javamail.jar包复制到该目录下,在编译Servlet或JavaMail程序时,就不必在CLASSPATH环境变量中增加包含Servlet API的jar包或者是javamail.jar包文件。

以上,就是一个JAVA程序执行的大致过程。

------------------------------------------

Java字节码程序的执行过程:


《Java平台体系》——第二章 JVM——Java字节码程序的执行过程
Java字节码程序的执行过程

Java程序在启动的时候首先交给JVM(一个JVM的运行创建一个独立的进程)一个拥有public static void main(string[] args)函数的类,JVM通过引导类加载器(Bootstrap ClassLoader)加载该类,加载完成之后进行校验、内存填充和结构化(即连接--校验/准备/分解),然后启用一个线程执行main函数(大多数可执行程序都有像main一样的入口函数约定,有些地方可以成为入口地址),在执行main函数的过程中碰到新的类,将会再次用ClassLoader加载该类,重复连接,并且继续执行main中调用的其它函数,依次反复,直到特定的终止条件发生,程序退出。

JVM执行连接是典型的动态链接,也就是在执行过程中按需加载类,所有加载类的工作都交由ClassLoader来完成。在后面谈到的 Java字节码类文件格式?就是ClassLoader加载之后交给虚拟机的字节码格式,换句话来说JVM不管ClassLoader之前的类来源和格式,它只管ClassLoader加载之后的格式,理解这点很重要。 

ClassLoader分为系统级和用户自定义级两类,通过用户自定义类加载器,可以完成自定义的类加载方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值