java编译器讲java源代码编译成.class的字节码文件.然后jvm再将字节码转化为机器码交给机器执行.java字节码文件是实现跨平台的基础.他与平台无关
JVM的具体执行流程是 装载-验证-准备-解析-初始化-对象实例化-垃圾回收-对象终结-卸载类型
一.装载:将.class的二进制文件通过类加载器转入JVM的方法区
二.验证:由java编译器生成的java类的二进制数据肯定是正确的,为什么还要进行类的验证,因为java虚拟机并不知道某个特定的.class文件到底是如何被创建的,这个.class文件有可能是由正常的java编译器生成的,也可能是由黑客特制的,黑客视图通过它来破坏jvm环境。类的验证能提高程序的健壮性,确保程序被安全的执行。
类验证的内容:
1 类文件的结构检查,确保类文件遵从java类文件的固定格式。
2 语义检查确保本身符号java语言的语法规定,如验证final类型的类没有子类等
3 字节码验证:确保字节码可以被jvm安全的执行,字节码代表java方法(包括静态和实例方法),它是由被称做操作码的单字节指令组成的序列,每一个操作码后都跟着一个或多个操作数。字节码验证步骤会检查每个操作码是否合法,即是否有合法的操作数。
4 二进制兼容的验证,确保相互引用的之间协调一致,如Worker类的goWork方法会调用Car类的run方法,jvm在验证Worker类时,会检查方法区内是否存在car类的run方法,如不存在会(Worker 类和car类版本不兼容就会出现问题),就会抛出NoSuchMethodError错误。
(注:Error类就是在验证阶段由JVM抛出的)
三.准备:JVM为类变量分配内存
四.解析:将类,接口,字段和方法等的符号引用替换成直接引用(如Test.method()这个.方法就是符号引用.JVM会生成一个直接指向method()方法的引用)
五.初始化:为类变量赋初始值
六.垃圾回收:释放方法区.栈区.堆区的内存
JVM的具体执行流程是 装载-验证-准备-解析-初始化-对象实例化-垃圾回收-对象终结-卸载类型
一.装载:将.class的二进制文件通过类加载器转入JVM的方法区
二.验证:由java编译器生成的java类的二进制数据肯定是正确的,为什么还要进行类的验证,因为java虚拟机并不知道某个特定的.class文件到底是如何被创建的,这个.class文件有可能是由正常的java编译器生成的,也可能是由黑客特制的,黑客视图通过它来破坏jvm环境。类的验证能提高程序的健壮性,确保程序被安全的执行。
类验证的内容:
1 类文件的结构检查,确保类文件遵从java类文件的固定格式。
2 语义检查确保本身符号java语言的语法规定,如验证final类型的类没有子类等
3 字节码验证:确保字节码可以被jvm安全的执行,字节码代表java方法(包括静态和实例方法),它是由被称做操作码的单字节指令组成的序列,每一个操作码后都跟着一个或多个操作数。字节码验证步骤会检查每个操作码是否合法,即是否有合法的操作数。
4 二进制兼容的验证,确保相互引用的之间协调一致,如Worker类的goWork方法会调用Car类的run方法,jvm在验证Worker类时,会检查方法区内是否存在car类的run方法,如不存在会(Worker 类和car类版本不兼容就会出现问题),就会抛出NoSuchMethodError错误。
(注:Error类就是在验证阶段由JVM抛出的)
三.准备:JVM为类变量分配内存
四.解析:将类,接口,字段和方法等的符号引用替换成直接引用(如Test.method()这个.方法就是符号引用.JVM会生成一个直接指向method()方法的引用)
五.初始化:为类变量赋初始值
六.垃圾回收:释放方法区.栈区.堆区的内存