Java代码执行机制
一、java源码编译机制

一个java文件编译为.class文件的流程图。
Parse an Enter阶段:
Parse:将代码字符串转换为token序列(com.sun.tools.javac.parser.Scanner),再将token转换为语法抽象树(com.sun.tools.javac.parser.Parser)
Enter:将符号输入到符号表.内容包括确定超类型和接口,添加类默认构造器
Annotation阶段:
主要处理用户自定义的注解
Analyse and Generate阶段:
Analyse:将语法抽象树进行一系列分析,包括:检查变量使用前是否声明,检查类型匹配,有返回值的方法必须有返回值等等
Generate:生成.class文件(com.sun.tools.javac.jvm.Gen)
生成的class文件包括:
结构信息:class文件格式版本号及各部分数量,大小
元数据:类,父类,接口信息,方法声明,常量池
方法信息:对应java源码中语句、表达式部分
二、类加载机制

1.Load(装载):
找到二进制字节码并加载到JVM中
2.Link(链接):
VerifyàPrepareàResolve
校验阶段:
校验二进制字节码格式,初始化装载类中的静态变量及解析类中调用的接口、类
如果格式不符合,会抛出VerifyError异常;校验过程中碰到要引用其他的接口和类,也要进行加载;如果加载失败,抛出NoClassDefFoundError一样
Prepare准备阶段
完成校验后,JVM初始化类中的静态变量,并赋予默认值
最后,对类中的所有属性、方法进行验证,保证对应的属性、方法存在,否则抛出NoSuchMethodError、NoSuchFiledError
3.Intialize(初始化):
要想初始化,必须通过校验及准备阶段
初始化就是执行类的static初始化代码、构造器代码、static属性的初始化。初始化被触发的几种情况:
|-调用new
|-反射调用类中的方法
|-之类调用了初始化
|-JVM启动过程中指定的初始化类
ClassLoader方面的常见异常
ClassNotFoundException:
很常见的异常,加载的类不在Classpath中就会抛出此异常。对于自定义的类加载器(继承ClassLoader),需要查看这个ClassLoader加载类的过程来分析类的加载路径
NoClassDefFoundError:
|
public class A{ public B b = new B(); } |
类A引用类B,若B不存在或ClassLoader没法加载B,则抛出此异常
3.LinkageError
重复加载类造成的异常,自定义ClassLoader情况下容易出现,因为此类已经在ClassLoader加载过了
4.ClassCastException
类型转换异常,较容易查找,比较难的是两个类A对象被不同的ClassLoader加载所引发的异常
Java代码执行机制的更多相关文章
- Java虚拟机JVM内存分区及代码执行机制
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt230 1. JVM体系结构 图1 JVM体系结构 方法区:存放JVM ...
- 第一章 Java代码执行流程
说明:本文主要参考自<分布式Java应用:基础与实践> 1.Java代码执行流程 第一步:*.java-->*.class(编译期) 第二步:从*.class文件将其中的内容加载到内 ...
- Java 代码执行流程
Java 代码执行流程 类加载过程 加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载 类加载时机:代码使用到这个类时 验证阶段 &qu ...
- 【Hadoop离线基础总结】通过Java代码执行Shell命令
通过Java代码执行Shell命令 需求 在实际工作中,总会有些时候需要我们通过java代码通过远程连接去linux服务器上面执行一些shell命令,包括一些集群的状态管理,执行任务,集群的可视化界面 ...
- 使用java代码执行linux命令
前提: java代码是在windows下面写的,要打包放到linux下面运行,并且执行某个脚本. java代码: try { // 起作用的代码其实就下面这一行, 参数是linux中要执行的代码 Ru ...
- JS代码执行机制
JS代码从编译到执行 我们写出一段JS代码,JS的引擎并不是按照我们书写的顺序从上到下顺序编译并且执行的,首先是按照自己的规则对我们的代码先进行编译,然后从上到下执行编译的代码. 在全局作用域中,JS ...
- Java代码执行过程概述
Java代码经历三个阶段:源代码阶段(Source) -> 类加载阶段(ClassLoader) -> 运行时阶段(Runtime) 首先我们来理清一下Java代码整个执行过程, 让我们对 ...
- java 代码执行cmd 返回值异常 (关于JAVA Project.waitfor()返回值是1)
关于JAVA Project.waitfor()返回值是1 0条评论 Project.waitfor()返回值是1,找了很久从网上没有发现关于1的说明. 这时对源代码调试了一下,发现Project ...
- Java代码执行顺序(静态变量,非静态变量,静态代码块,代码块,构造函数)加载顺序
//据说这是一道阿里巴巴面试题,先以这道题为例分析下 public class Text { public static int k = 0; public static Text t1 = new ...
随机推荐
- 系列文章----.Net程序员学用Oracle系列
.Net程序员学用Oracle系列(18):PLSQL Developer 攻略 .Net程序员学用Oracle系列(17):数据库管理工具(SQL Plus) .Net程序员学用Oracle系列(1 ...
- QtCreator开启-O编译优化的方式
首先,编译优化必须是在Release模式下进行,保证程序没有任何bug的条件下进行执行.编译优化能极大提升程序的运行效率,级别越高速度越快,但是对代码健壮性要求也越高! 选择编译release模式,在 ...
- (转)C# 特性(Attribute)详细介绍
本文转载自:http://www.cnblogs.com/luckdv/articles/1682488.html 1.什么是Atrribute 首先,我们肯定Attribute是一个类,下面是msd ...
- 机器学习:SVM(SVM 思想解决回归问题)
一.SVM 思想在解决回归问题上的体现 回归问题的本质:找到一条直线或者曲线,最大程度的拟合数据点: 怎么定义拟合,是不同回归算法的关键差异: 线性回归定义拟合方式:让所有数据点到直线的 MSE 的值 ...
- 第15届浙江省赛 D Sequence Swapping(dp)
Sequence Swapping Time Limit: 1 Second Memory Limit: 65536 KB BaoBao has just found a strange s ...
- 在U盘分区安装Kali并引导live CD 教程以及常见的注意事项
Kali Linux作为强大的全能渗透系统,把它制成Live CD基本算是必备技能了,但是官方提供的文档虽然简单,但是整个U盘都会被占用,确实是有点可惜,结合网上提供的一些思路加上自己的经验,向大家讲 ...
- iOS开发之---KVC全解
————————————————————————————————————————————————————————————— 一 KVC的基本概念 KVC是Key Value Coding的缩写,意思是 ...
- 2016.2.24 利用用户控件和委托完美解决快速选择txbbox
1.首先将tet_box和一个datagridview控件打包成用户控件uC_QuickTxtBox 2.在用户控件中定义执行主窗口的委托函数 3.主窗体中添加用户控件的load事件,赋值 uC_Qu ...
- java反射专题三
一丶调用运行时类中指定的属性 Class clazz = Person.class; //1.获取指定的属性 Field name = clazz.getField("name") ...
- Android中Activity之间的数据传递
在开发中,我们经常涌用到Activity,那么既然用到了Activity,就一定免不了在两个或者多个Activity之间传递数据.这里我们先说一说原理,然后在看看代码和例子. 情况A:我们需要从Act ...