1.字节码是跨平台的吗
Java虚拟机不包括Java在内的任何语言绑定,它只与” Class 文件 “ 这种特定的二进制文件格式所关联
Class文件里面是什么
源代码经过编译器编译之后便会生成一个字节码文件,字节码是一种二进制的类文件,他的内容是JVM的指令.
目前前端编译器的的局限性
前端编译器并不会直接涉及编译优化等方面的技术,而是将这些具体优化的逻辑细节移交给HotSpot的JIT的编译器负责
AOT(静态提前编译器 Ahead Of Time Compiler)
- JDK9引入的AOT编译器(静态编译器,Ahead Of Time Complier)
- Java 9引入实验性的AOT的编译工具jaotc,它借助了Graal编译器,将所输入的Java类文件转换为机器码,并且存放生成动态共享库之中
- 所谓的AOT编译,与即时编译(JIT)相对立的一个概念,我们知道,即时编译指的是在程序运行过程中,将字节码转换为可以直接在硬件上直接运行的机器码,并且部署到托管的环境中. 而AOT编译指的则是,在程序运行之前,将字节码转换为机器码的过程 .java -> .class -> .so
- 最大的好处: Java虚拟机已经加载预编译的二进制文件,不必等待即时编译的预热,减少Java应用给人带来”第一次运行慢”的不良体验
- 缺点:
- 破坏了Java一次编译,到处运行的,必须未每个硬件准备对应的so文件
- 降低了Java链接过程的动态性,加载的代码在编译时期就已经全部已知.
1.那些类型对应有Class对象
// class (外部类,成员(成员内部类,静态内部类)) 局部内部类 , 匿名内部类 --> Object.class
// interface: 接口 --> FactoryBean.class
// [] : 数组 --> String[].class / int[].class / int[][].class
// enum: 枚举 --> ElementType.class
// annotation: 注解 --> Component.class
// primitive type: 基本数据类型 int.class
// void
int[] int_1 = new int[10]
int[] int_2 = new int[100]
Class class_01 = int_1.getClass()
Class class_02 = int_2.getClass()
// 只要元素类型和维度一样,就是同一个Class
System.out.println(class_01==class_02);