jvm的无关性
1. 平台无关性,这是建立在操作系统上的,许多虚拟机厂商提供了可以运行在不同系统上的虚拟机,实现了载入和执行字节码文件
2. 语言无关性,虚拟机不与Java绑定,之和。class文件有关,这个文件包含了虚拟机指令
3. 画个图
.java 经过javac编译器 ->.class
.rb 经过jrubyc编译器 ->.class
.groovy 经过groovy编译器 ->.class 统一执行在java虚拟机
.class文件
1. 查看工具有 sublime javap -v jclasslib(idea)
2. .class 文件是一个十六进制的文件,其中没有分隔符,所以很紧凑
3. 文件格式:无符号数和表,
4. 无符号 u1,其中1代表一个字节,一个字节代表俩位十六进制的数字
5. 表是由多个无符号数字组成或者其他表组成。一般由_info结尾
.class文件中的魔数与jdk版本
1. magic number (u4) 表示文件是否能被虚拟机接受,
2.紧接着的时jdk的版本号,分为大版本小版本,u2 u2, 对应的十进制 52.0
.class文件中的常量池
1. 常量池的入口放一个 u2数据作为常量池的计数器
2. 常量池主要存储字面量和符号引用,字面量就是字符串之类的具体值,符号引用方法名之类
.class文件中的访问标志
1. 表示当前这个class的类型,访问权限
.class类索引,夫类索引,接口索引集合
.class类字段表的集合
.class类方法表的集合
1. <init>
2. <client>
.class类属性表的集合
.class类字节码指令
1. methods:里面都是method_info
.class类加载和存储指令
.class类运算指令
.class类类型转换指令
1. i2b :2代表to
.class类创建实例的指令
1. new
.class类创建数组的指令
1. newarray
.class访问字段指令
1. getfield、putfield、getstatic、putstatic。
.class字节码指令处理异常 重要
1. 通过goto实现
.class文件自己码指令装箱拆箱
1. int->integer integer-int
2. integerCache 这个涉及到缓存,下线-128,上线自定义时127可以改,-vm参数修改
.class文件字节码指令-数组
1. 创建数组 newarray
2. 获取数组的长度arraylengh
.class文件的foreach
1. 通过迭代器实现
.class文件的注解@
.class总结
1. 比如异常的处理、finally 块的执行顺序;以及隐藏的装箱拆箱和 foreach 语法糖的底层实现。 还有字节码指令,可能有几千行,看起来很吓人,但执行速度几乎都是纳秒级别的。Java 的无数框架,包括 JDK,也不会为了优化这种性能对代码进行 限制。了解其原理,但不要舍本逐末,比如减少一次 Java 线程的上下文切换,就比你优化几千个装箱拆箱动作,速度来的更快一些