一个Java程序的执行过程

来源:互联网 发布:淘宝网如何开网店 编辑:程序博客网 时间:2024/06/06 20:02
我们手工执行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包中搜索要加载的类,所以,如果将包含例如ServletAPI的jar包或者是javamail.jar包复制到该目录下,在编译Servlet或JavaMail程序时,就不必在CLASSPATH环境变量中增加包含ServletAPI的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分为系统级和用户自定义级两类,通过用户自定义类加载器,可以完成自定义的类加载方式(如何自定义请参考该章的实战?部分)。

关于更多Java字节码的执行过程细节,在后面内容JVM抽象架构?中将会更进一步提到。
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 魅族账号密码和密保都忘记了怎么办 vivo账号的密保问题忘了怎么办 oppo账号密保问题忘了怎么办 小米手机刷了机忘了账号密码怎么办 忘了小米账号的密码是多少怎么办 千牛账号在手机上被限制登录怎么办 违规的千牛账号被限制登录了怎么办 苹果id和锁屏密码忘记了怎么办 感应门的编程密码忘记了怎么办 交易猫买的号被找回了怎么办 uc上我的小说看不了怎么办 微信零钱忘记密码没有银行卡怎么办 九游平台冻结提不了现怎么办 计算机考试报名登录名忘记了怎么办 云顶扑克提现怎么提不出来怎么办 微信正在下载一直0kb怎么办 守望先锋运行时出现意外错误怎么办 信用卡暂停使用怎么办还能恢复吗 新刷乳胶漆墙面一碰一个坑怎么办 夏天开空调冻着了头疼打喷嚏怎么办 桑蚕丝衣服被沐浴露退了色怎么办 空间被别人知道了密码登录了怎么办 三星手机显示解析包出现问题怎么办 三星手机下载解析包出现问题怎么办 两万的流动大棚给整坏了怎么办 劲舞团抽奖领了一样的衣服怎么办 win系统ps界面字体太小怎么办 任何网页都变成监控登录界面怎么办 微信启动录音的尝试被拒绝怎么办 微信传到电脑的文件打不开怎么办 转转网账号出租时遇到防沉迷怎么办 如果买了王者号结果有防沉迷怎么办 苹果手机一直显示验证失败怎么办呢 安装包证书异常导致安装失败怎么办 qq飞车忘了几区的怎么办 5e在游戏里卡住不动怎么办 别人发的cdr文件打开太慢怎么办 qq红包充值话费未到账怎么办 qq飞车充值至尊皇冠不到账怎么办 微信支付金额超过单日限制怎么办 不小心在qq钱包中充错话费怎么办