01-basic

compile 英 [kəmˈpaɪl] v. 汇编,编纂;编译(电脑程式);收集,搜集(信息,资料);累积(得分)

compilation 英 [ˌkɒmpɪˈleɪʃn] n. 编纂,汇编;汇编物,辑

specification 英 [ˌspesɪfɪˈkeɪʃ(ə)n] n. 规格,规范,明细单,说明书;明确说明,详述;(申请专利用的)发明物说明书

hotspot 英 ['hɒtspɒt] n. 热点;热区

liquid 英 [ˈlɪkwɪd] n. 液体,液态物;流音,adj. 液态的,液化的

minor 英 [ˈmaɪnə(r)] adj. 较小的,次要的,轻微的

major 英 [ˈmeɪdʒə(r)] adj. 重大的,主要的;严重的

constant ['kɔnstənt] n. 常数,恒量;不变的事物

access 英 [ˈækses] n. 入口,通道;获得的机会,使用权;(对计算机存储器的)访问,存取,v. 接近,进入;获取,访问(计算机信息)

编译:把高级语言变成计算机可以识别的二进制语言,计算机只认识0、1

1. JVM和class

image-20220711180437212
  1. 跨平台的语言到跨语言的平台
  2. JVM是一种规范
  3. 虚构出来的一台计算机
    • 字节码指令集(汇编语言)
    • 内存管理:栈、堆、方法区等
  4. JVM与Java无关,任何语言只要能转化为.class,符合class文件规范都可以跑在JVM上

2. Hotspot

常见的JVM实现,JVM版本

  1. Hotspot
    • Oracle官方,默认用的JVM。java –version
  2. Jrockit
    • BEA,曾经号称世界上最快的JVM。被Oracle收购,合并于hotspot
  3. J9 – IBM
  4. Microsoft_VM
  5. TaobaoVM
    • Hotspot深度定制版
  6. LiquidVM
    • 直接针对硬件
  7. azul_zing
    • 最新垃圾回收的业界标杆
    • www.azul.com

JDK > JRE > JVM(包含关系)

  • JVM:Java_Virtual_Machine(Java虚拟机)
  • JRE:Java_Runtime_Environment(Java运行环境)
  • JDK:Java_Development_Kit(Java语言的软件开发工具包)
  • SDK:Software_Development_Kit(软件开发工具包)

3. Class文件格式

编译后的.class文件,即idea_target下的文件,是二进制文件,idea进行了反编码。sublime打开时,进行了16进制格式化

4. Class文件解读

CAFE BABE是java编译后的.class文件的开头

  1. 二进制字节流
  2. 数据类型:u1 u2 u3 u4 u8 和_info(表类型)_
    • info的来源是Hotspot源码中的写法
  3. 查看16进制格式的ClassFile
    • sublime/notepad
    • IDEA插件-BinEd
  4. 有很多可以观察ByteCode的方式
    • javap
    • JBE:可以直接修改
    • JClassLib:idea插件之一。idea菜单栏View =>《Show_Bytecode_With_Jclasslib》
  5. ClassFile构成
classFile {
    u4 magic,
    u2 minor_version;
    u2 major_version;
    u2 constant_pool_count;
    cp_info constant_pool[constant_pool_count -1];
    u2
}
image-20220711180626593

javap + .class文件 = 文件详细信息

➜  ~# javap -v /Users/listao/mca_proj/jvm/target/classes/com/listao/jvm/c1_bytecode/T1_ByteCode.class
Classfile /Users/list/mca_proj/jvm/target/classes/com/listao/jvm/c1_bytecode/T1_ByteCode.class
  Last modified Apr 29, 2023; size 312 bytes
  MD5 checksum 4518fbb88233a800a8d05beea7e4f067
  Compiled from "T1_ByteCode.java"
public class com.listao.jvm.c1_bytecode.T1_ByteCode
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #3.#13         // java/lang/Object."<init>":()V
   #2 = Class              #14            // com/listao/jvm/c1_bytecode/T1_ByteCode
   #3 = Class              #15            // java/lang/Object
   #4 = Utf8               <init>
   #5 = Utf8               ()V
   #6 = Utf8               Code
   #7 = Utf8               LineNumberTable
   #8 = Utf8               LocalVariableTable
   #9 = Utf8               this
  #10 = Utf8               Lcom/listao/jvm/c1_bytecode/T1_ByteCode;
  #11 = Utf8               SourceFile
  #12 = Utf8               T1_ByteCode.java
  #13 = NameAndType        #4:#5          // "<init>":()V
  #14 = Utf8               com/listao/jvm/c1_bytecode/T1_ByteCode
  #15 = Utf8               java/lang/Object
{
  public com.listao.jvm.c1_bytecode.T1_ByteCode();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 3: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Lcom/listao/jvm/c1_bytecode/T1_ByteCode;
}
SourceFile: "T1_ByteCode.java"

5. Jclasslib

一步一步在类中增加内容,查看它的class改变

  1. 类增加interface
image-20230409214155297
image-20230409214313088
  1. int i = 888;
image-20230409214620615

6. 纤程

JVM本身是不支持纤程的

1. concept

image-20220712112228826
  • JDK13都没有见到支持纤程的影子,要用第三方开源的库quaser
  • go、kotlin、python默认支持

2. eg

VM options:-javaagent:/Users/listao/.m2/repository/co/paralleluniverse/quasar-core/0.7.10/quasar-core-0.7.10.jar

<dependency>
    <groupId>co.paralleluniverse</groupId>
    <artifactId>quasar-core</artifactId>
    <version>0.7.10</version>
</dependency>
public class HelloFiber {

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        for (int i = 0; i < 10_000; i++) {

            // cacl();

            Fiber<Void> fiber = new Fiber<>(new SuspendableRunnable() {
                public void run() throws SuspendExecution, InterruptedException {
                    cacl();
                }
            });
            fiber.start();

            // Thread thread = new Thread(new Runnable() {
            //     @Override
            //     public void run() {
            //         cacl();
            //     }
            // });
            // thread.start();
        }
        System.out.println(System.currentTimeMillis() - start);
    }

    static void cacl() {
        int result = 0;
        for (int i = 0; i < 10000; i++) {
            for (int j = 0; j < 200; j++) {
                result += i;
            }
        }
    }
}