java虚拟机基础知识大全 java虚拟机运行原理( 二 )


7.方法表集合 方法里的Java代码,经过Javac编译器编译成字节码指令之后,存放在方法属性表集合中一个名为“Code”的属性里面,属性表作为Class文件格式中最具扩展性的一种数据项目 。
有可能会出现由编译器自动添加的方法,最常见的便是类构造器“()”方法和实例构造器“()”方法
8.属性表()在前面的讲解之中已经出现过数次,Class文件、字段表、方法表都可以携带自己的属性表集合,以描述某些场景专有的信息 。《Java虚拟机规范》允许只要不与已有属性名重复,任何人实现的编译器都可以向属性表中写入自己定义的属性信息,Java虚拟机运行时会忽略掉它不认识的属性 。
Java字节码指令就是Java虚拟机能够听得懂、可执行的指令,可以说是Jvm层面的汇编语言,或者说是Java代码的最小执行单元 。
javac命令会将Java源文件编译成字节码文件,即.class文件,其中就包含了大量的字节码指令 。
Java虚拟机采用面向操作数栈而不是面向寄存器的架构(这两种架构的执行过程、区别和影响将在第8章中探讨),所以大多数指令都不包含操作数,只有一个操作码,指令参数都存放在操作数栈中 。
字节码指令分类:
存储和加载类指令:主要包括load系列指令、store系列指令和ldc、push系列指令,主要用于在局部变量表、操作数栈和常量池三者之间进行数据调度;(关于常量池前面没有特别讲解,这个也很简单,顾名思义,就是这个池子里放着各种常量,好比片场的道具库)
对象操作指令(创建与读写访问):比如我们刚刚的和就属于读写访问的指令,此外还有/,还有new系列指令,以及等指令 。
操作数栈管理指令:如pop和dup,他们只对操作数栈进行操作 。
类型转换指令和运算指令:如add/div/l2i等系列指令,实际上这类指令一般也只对操作数栈进行操作 。
控制跳转指令:这类里包含常用的if系列指令以及goto类指令 。
方法调用和返回指令:主要包括系列指令和系列指令 。这类指令也意味这一个方法空间的开辟和结束,即会唤醒一个新的java方法小宇宙(新的栈和局部变量表),而则意味着这个宇宙的结束回收 。
虚拟机实现的方式主要有以下两种:
·将输入的Java虚拟机代码在加载时或执行时翻译成另一种虚拟机的指令集;
·将输入的Java虚拟机代码在加载时或执行时翻译成宿主机处理程序的本地指令集(即即时编译器代码生成技术) 。
精确定义的虚拟机行为和目标文件格式,不应当对虚拟机实现者的创造性产生太多的限制,Java虚拟机是被设计成可以允许有众多不同的实现,并且各种实现可以在保持兼容性的同时提供不同的新的、有趣的解决方案 。
Class文件格式所具备的平台中立(不依赖于特定硬件及操作系统)、紧凑、稳定和可扩展的特点,是Java技术体系实现平台无关、语言无关两项特性的重要支柱 。
Class文件是Java虚拟机执行引擎的数据入口,也是Java技术体系的基础支柱之一 。
Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制 。
类的生命周期
java编译时不像其他语言需要连接,类型的加载、连接和初始化过程都是在程序运行期间完成的 。编写一个面向接口的应用程序,可以等到运行时再指定其实际的实现类,用户可以通过Java预置的或自定义类加载器,让某个本地的应用程序在运行时从网络或其他地方上加载一个二进制流作为其程序代码的一部分 。运行时加载广泛应用于Java程序之中 。