1.什么是jvm?
1.jvm是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在时间的计算机上仿真模拟各种计算机功能来实现的
2.jvm是Java平台无关的基础
3.jvm是java的核心和基础
4.jvm负责运行字节码:jvm把每一条要执行的字节码交给解释器,翻译成对应的机器码,然后由解释器执行。jvm解释执行字节码文件就是jvm操作java解释器进行解释执行字节码文件的过程
2.类加载器
1.Bootstrap根类加载器(由c语言来编写的)
2.Extension扩展类加载器
3.Application系统类加载器
3.类加载器的三个机制
1.委托(加载类的请求向上委托,如果不行再向下委托)
双亲委托机制:指将其中一个类的请求交给父类加载器,如果这个父类加载器不能够找到或者加载这个类,那么在加载它
2.可见性(子类的加载器可以看见所有的父类加载器的类,而父类加载器看不到子类加载器加载的类)
3.单一性(仅加载一个类一次,这是由委托机制确保子类加载器不会再次加载父类加载器加载过的类)
4.类的装载
1.加载类的过程:加载类>验证>准备>解析>初始化>使用>卸载
类在准备阶段会给类的静态属性分配内存,并设置默认初始值
例如1:
public static int a=1;
在准备阶段,a会被初始化为0(int类型默认值为1),而在初始化的<clinit>中才会被设置为1。
对于static final类型:
public static final int a=1;
在准备阶段就会被赋上正确的值。
例如2:
public class DemoStatic {
//测试static静态属性在赋值时是分了两步,在验证准备阶段赋默认值,然后在初始化阶段赋正确的值
//测试静态常量,在准备阶段就赋了正确的值(要给属性赋的初始值)
static TestTwo t=new TestTwo(); //TestTwo t=null; value=0 静态代码块输出 0
static int value=10; //value=0;
final static int sum=888;
static{//静态代码块
System.out.println(value);
}
public static void main(String[] args) {
}
}
class TestTwo{
static{
System.out.println("====="+DemoStatic.value);
System.out.println("====="+DemoStatic.sum);
}
}
2.类装载器:最小的执行单位是class文件,原理是用谁装谁(懒惰式装载)
5.字节码校验器
检查:
1.变量要在使用前初始化
2.方法调用与对象引用类型之间要匹配
3.访问私有数据和方法的规则有没有被违反
4.对本地变量的访问都在运行的堆栈内
以上这些检查没有通过,类就不会被加载
6.jvm的原理:
java源代码>通过编译器>生成字节码>通过类加载器进行加载>再经过字节码校验器进行验证>再分别经过解释器和及时编译器(JIT编译器)进行解释编译字节码文件>运行