01 优秀的Java开发者
大家都是有经验的Java开发人员,想想为何要学习JVM?[面试?调优?装逼?]
不管出于何种原因,总之你得先学好。那怎么学好呢?
因为目前课堂中有大学生和工作几年的,也就是每个人对于JVM的了解可能不一样,这就要考虑到怎么
切入
既然大家都学习过Java,那不妨就从Java开始聊起,同时也是扫盲,毕竟不是每个小伙伴都是计算机专
业
1.1 什么是Java?
Java是一门面向对象的高级编程语言
1.2 编程语言
编程语言(英语:programming language),是用来定义[计算机程序]的[形式语言]。它是一种被[标
准化]的交流技巧,用来向[计算机]发出指令。一种能够让[程序员]准确地定义计算机所需要使用数据的
计算机语言,并精确地定义在不同情况下所应当采取的行动。
说白了就是让人类能够和计算机沟通,所以要学习计算机能够懂的语言
1.3 计算机[硬件]能够懂的语言
你
的
好
更
为
院 只
学
1.3.1 计算机发展史
1946-1958:电子管计算机
1958-1964:晶体管计算机
1964-1970:集成电路计算机
1970-至今:大规模集成电路计算机
猜想:未来以蛋白质分子作为原材料,量子计算机[已经有了]
泡
咕
1.3.2 计算机体系结构
遵循冯诺依曼计算机结构
1.3.3 计算机处理数据过程
(1)提取阶段:由输入设备把原始数据或信息输入给计算机存储器存起来
(2)解码阶段:根据CPU的指令集架构(ISA)定义将数值解译为指令
(3)执行阶段:再由控制器把需要处理或计算的数据调入运算器
(4)最终阶段:由输出设备把最后运算结果输出
本质上就是CPU取数据指令然后返回
CPU=存储器+运算器+控制器
1.3.4 机器语言
我们把CPU能够直接认识的数据指令,称为机器语言,也就是010101001这种形式
1.3.5 不同厂商的CPU
单核、双核、多核
Intel、AMD、IBM等
不同CPU使用的CPU指令集是不一样的,这就会有不兼容的问题
而且要是直接操作01这种形式的,非常麻烦并且容易出错,硬件资源管理起来也不方便
你
的
好
1.3.6 操作系统
向下对接指令系统、管理硬件资源
向上提供给用户简单的操作命令和界面
1.3.7 汇编语言
更
为
低级语言,通过汇编器翻译成机器语言
MOV、PUSH、ADD等
对机器友好,执行效率比较高,移植性差
学
泡
咕
1.3.8 高级语言
但是人类操作起来还是不太方便,或者需要专业的人员
院 只
C、C++、Java、Python、Golang等
最终肯定还是要转换成机器能够懂的机器语言
1.3.9 编译型和解释型
1.3.9.1 编译型
使用专门的编译器,针对特定的平台,将高级语言源代码一次性的编译成
可被该平台硬件执行的机器码,并包装成该平台所能识别的可执行性程序的格式。
C、C++、GoLang
编译型语言:
执行速度快、效率高;依靠编译器、跨平台性差些。
把做好的源程序全部编译成二进制代码的可运行程序。然后,可直接运行这个程序。
1.3.9.2 解释型
使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行。
是代码在执行时才被解释器一行行动态翻译和执行,而不是在执行之前就完成翻译。
Python、Javascript
解释型语言:
执行速度慢、效率低;依靠解释器、跨平台性好。
把做好的源程序翻译一句,然后执行一句,直至结束。
1.3.9.3 Java呢?
Java属于编译型+解释型的高级语言
其实并不是因为有javac将Java源码编译成class文件,才说Java属于编译+解释语言,因为在这个编译器编
译之后,生成的类文件不能直接在对应的平台上运行。
那为何又说Java是编译+解释语言呢?因为class文件最终是通过JVM来翻译才能在对应的平台上运行,而这
个翻译大多数时候是解释的过程,但是也会有编译,称之为运行时编译,即JIT(Just In Time)。
综上所述,Java是一门编译型+解释型的高级语言。
你
的
好
更
为
院 只
1.4 So JVM是什么?
Java Virtual Machine(Java虚拟机)
Write Once Run Anywhere
学
泡
咕
1.5 JDK JRE JVM
Java官网 :https://docs.oracle.com/javase/8/
Reference -> Developer Guides -> 定位到:https://docs.oracle.com/javase/8/docs/index.html
JDK 8 is a superset of JRE 8, and contains everything that is in JRE 8, plus
tools such as the compilers and debuggers necessary for developing applets and
applications. JRE 8 provides the libraries, the Java Virtual Machine (JVM), and
other components to run applets and applications written in the Java programming
language. Note that the JRE includes components not required by the Java SE
specification, including both standard and non-standard Java components.
你
的
好
更
为
02 JVM到底该学习什么
院 只
或者换句话说,JVM到底从哪边开始学习起?
学
泡
咕
(1)源码到类文件
(2)类文件到JVM
(3)JVM各种折腾[内部结构、执行方式、垃圾回收、本地调用等]
2.1 源码到类文件
2.1.1 源码demo
class Person{
private String name="Jack";
private int age;
private final double salary=100;
private static String address;
private final static String hobby="Programming";
private static Object obj=new Object();
public void say(){
System.out.println("person say...");
}
public static int calc(int op1,int op2){
op1=3;
int result=op1+op2;
Object obj=new Object();
return result;
}
public static void main(String[] args){
calc(1,2);
}
}
编译: javac -g:vars Person.java ---> Person.class
2.1.2 前期编译
你
的
好
更
为
Person.java -> 词法分析器 -> tokens流 -> 语法分析器 -> 语法树/抽象语法树
-> 语义分析器 -> 注解抽象语法树 -> 字节码生成器 -> Person.class文件
院 只
学
2.1.3 类文件(Class文件)
2.1.3.1 16进制
cafe babe 0000 0034 003f 0a00 0a00 2b08
002c 0900 0d00 2d06 4059 0000 0000 0000
0900 0d00 2e09 002f 0030 0800 310a 0032
0033 0700 340a 000d 0035 0900 0d00 3607
0037 0100 046e 616d 6501 0012 4c6a 6176
泡
咕
612f 6c61 6e67 2f53 7472 696e 673b 0100
0361 6765 0100 0149 0100 0673 616c 6172
7901 0001 4401 000d 436f 6e73 7461 6e74
......
2.1.3.2 The ClassFile Structure
官网 : https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
你
的
好
minor_version
major_version
u2:003f=63(10进制)
constant_pool_count:
更
为
院 只
表示常量池中的数量是62
cp_info constant_pool[constant_pool_count-1]
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}
2.1.3.3 Simple analysis
u4 :cafebabe
magic:The magic item supplies the magic number identifying the class file
format
u2+u2:0000+0034,34等于10进制的52,表示JDK8
The value of the constant_pool_count item is equal to the number of entries
in the constant_pool table plus one.
学
泡
咕
The constant_pool is a table of structures representing various string
constants, class and interface names, field names, and other constants that
are referred to within the ClassFile structure and its substructures. The
format of each constant_pool table entry is indicated by its first "tag"
byte.
The constant_pool table is indexed from 1 to constant_pool_count - 1.
常量池主要存储两方面内容:字面量(Literal)和符号引用(Symbolic References)
字面量:文本字符串,final修饰等
符号引用:类和接口的全限定名、字段名称和描述符、方法名称和描述符
2.1.3.4 javap验证
JDK自带的命令
javap -h
可以验证一下上述Classfile Structure前面几块内容的正确性
javap -v -p Person.class 进行反编译,查看字节码信息和指令等信息
是否有一种感觉?
JVM相对class文件来说可以理解为是操作系统;class文件相对JVM来说可以理解为是汇编语言或者机器
语言。
你
的
好
更
为
院 只
学
泡
咕
你
的
好
更
为
院 只
学
泡
咕