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对象

  1. // class (外部类,成员(成员内部类,静态内部类)) 局部内部类 , 匿名内部类 --> Object.class
  2. // interface: 接口 --> FactoryBean.class
  3. // [] : 数组 --> String[].class / int[].class / int[][].class
  4. // enum: 枚举 --> ElementType.class
  5. // annotation: 注解 --> Component.class
  6. // primitive type: 基本数据类型 int.class
  7. // void
  8. int[] int_1 = new int[10]
  9. int[] int_2 = new int[100]
  10. Class class_01 = int_1.getClass()
  11. Class class_02 = int_2.getClass()
  12. // 只要元素类型和维度一样,就是同一个Class
  13. System.out.println(class_01==class_02);