jvm(5)

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 线程的上下文切换,就比你优化几千个装箱拆箱动作,速度来的更快一些
原文地址:https://www.cnblogs.com/xiaoshahai/p/13408451.html