虚拟机基础概念
1.什么是虚拟机
2.流行的java虚拟机
3.从跨平台的语言到跨语言的平台
4.虚拟机知识体系
class文件结构
1.MagicNumber
2.ConstantPool
3.AccessFlags
4.Fields
5.Methods
6.常用工具
一:jvm基础
java从编码到执行
首先给你们讲一下这个过程。我们有一个X.java的文件,通过javac变成X.class。X.class会通过java命令会被ClassLoader装载到内存里。其中呢就会有java的一些类库之类的,然后ClassLoader通过解释器和编译器执行引擎。(理解即可,不需要死记硬背)
二.JVM(跨语言的平台)
像我们所使用或者见到的那些语言都是可以在JVM上运行的。
三.JVM与class文件格式
1.jvm与java无关(只跟class有关)
有人会问其他语言也是都编译成.class吗??
是的,必须是class文件,不一定是编译成的class文件,有的是下执行过程中产生的二进制流文件也会被JVM执行。
2.jvm是一种规范
--The Java® Virtual Machine Specification (oracle.com)
--The Java® Language Specification (oracle.com)
是虚构出来的一台计算机
--字节码指令集(汇编语言)
--内存管理:栈,堆 方法区等
四.常见的JVM实现
我们最常用的就是Hotspot
普及一下小知识点:LiquidVM针对硬件所以它的速度更快。azul旗下的zing是面对商业的,是收费的。速度最快可达1ms,这也就是为什么后面我们要讲的垃圾回收机制GC啦!
五.JDK JRE JVM三者之间的关系
jvm就是java虚拟机只是用来执行的。jre是运行时环境,也就是在运行时除了jvm还需要一些java的运行类库;jdk是在jre基础上的开发的工具。
六.Class File Format(了解一下,目前面试没有面到过,当做兴趣学习)
先看一段简单的代码以及它编译后的Class文件
源文件:
package com.tiantian.jvm.bytecode;
public class T0100_ByteCode01{
}
Class文件:
package com.tiantian.jvm.bytecode;
public class T0100_ByteCode01{
public T0100_ByteCode01(){
}
}
用class查看是这个代码,如果用十六进制看的话就是
查看十六进制格式的ClassFile subline或者是nodepad++ 和 idea插件BinED
二进制字节流:0/1组成
数据类型:u1 u2 u4 u8和_info(表类型)
七.Class文件结构:
1.Magic Number ** class文件的magic Number就是CA FE BA BE **
2.Minor Version
3.Major Version jdk1.8编译出来就是52 (十六进制0034转化为二进制就是52.0)
4.constant_pool_count **常量池有哪些数,可以存多少数**
5..constant_pool长度为constant_pool_count-1的表
6.access_flags 是否是public final super interface abstract synthetic annotation enum
7.this.class 当前的class文件指到常量池里文件的内容
8.super_class 副类指到常量池的内容
9.interfaces_count
10.interfaces
11.fields_count
12.fields
13.methods_count
14.methods
15.attributes_count-u2
16.attributes
(此时的constant_pool_count中是从1开始计数的)
有显示class文件的,比如javap,JBE可以直接修改,JClassLib(IDEA插件)
常量池理解:鉴这篇:这一次,彻底弄懂java中的常量池 - 掘金 (juejin.cn)
非常详细!