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
- 跨平台的语言到跨语言的平台
- JVM是一种规范
- java virtual machine specifications
- JDK 13 Documentation
- Java Language and Virtual Machine Specifications
- The Java Virtual Machine Specification, Java SE 17 Edition
- 虚构出来的一台计算机
- 字节码指令集(汇编语言)
- 内存管理:栈、堆、方法区等
- JVM与Java无关,任何语言只要能转化为.class,符合class文件规范都可以跑在JVM上
2. Hotspot
常见的JVM实现,JVM版本
- Hotspot
- Oracle官方,默认用的JVM。
java –version
- Oracle官方,默认用的JVM。
- Jrockit
- BEA,曾经号称世界上最快的JVM。被Oracle收购,合并于hotspot
- J9 – IBM
- Microsoft_VM
- TaobaoVM
- Hotspot深度定制版
- LiquidVM
- 直接针对硬件
- 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文件的开头
- 二进制字节流
- 数据类型:u1 u2 u3 u4 u8 和_info(表类型)_
- info的来源是Hotspot源码中的写法
- 查看16进制格式的ClassFile
- sublime/notepad
- IDEA插件-BinEd
- 有很多可以观察ByteCode的方式
- javap
- JBE:可以直接修改
- JClassLib:idea插件之一。idea菜单栏View =>《Show_Bytecode_With_Jclasslib》
- ClassFile构成
classFile {
u4 magic,
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count -1];
u2
}
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改变
- 类增加interface
int i = 888;
6. 纤程
JVM本身是不支持纤程的
1. concept
- 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;
}
}
}
}