一:JVM概念
1:JVM实例
JVM实例对应了一个独立运行的java程序---它是进程级别;
2:JVM执行引擎实例
JVM执行引擎实例则对应了属于用户运行程序的线程-----它是线程级别的
二、JVM的生命周期
(1)JVM实例的诞生
当启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void main(String[] args)函数的class都可以作为JVM实例运行的起点
(2)JVM实例的运行
main()作为该程序初始线程的起点,任何其他线程均由该线程启动。JVM内部有两种线程:守护线程和非守护线程,main()属于非守护线程,守护线程通常由JVM自己使用,java程序也可以标明自己创建的线程是守护线程。
(3)JVM实例的消亡
当程序中的所有非守护线程都终止时,JVM才退出;若安全管理器允许,程 序也可以使用Runtime类或者System.exit()来退出。
三:JVM的体系结构
一、 JVM的内部体系结构分为三部分,
1:分那几个部分
(1)类装载器(ClassLoader)子系统
作用:用来装载.class文件
(2)执行引擎
作用:执行字节码,或者执行本地方法
(3)运行时数据区
方法区,堆,java栈,PC寄存器,本地方法栈
二:类加载器
类加载器深度剖析、类的主动使用、被动使用:
一:类的加载、连接、初始化
加载:查找并加载类的二进制数据;
连接:
a:验证---确保被加载的类的正确性;
b:准备---为类的静态变量分配内存空间,并将其初始化为默认值;例如int型分配4个字节、long类型分配8个字节的内存空间,并赋予默认值0;
c:解析---把类中的符号引用转换成直接引用,例如car.run()前面是car类的run()方法的符号引用,JVM将符号引用替换成指针;
初始化:为类的静态变量初始化正确值;
初始化一个子类,必须先初始化父类,如果继承一个接口,接口是不会导致初始化,出发有调用接口中的静态变量,才会初始化接口;
二:有两种类型的类加载器
1:java虚拟机自带的加载器
根类加载器/Bootstrap---使用C++实现的
扩展类加载器/Extension
系统类加载器/System
ClassLoader classloader = ClassLoader.getSystemClassLoader();
Class<?> classzz = classloader.loadClass("com.Test");调用loadClass并不是对类的主动使用,并不会导致类的初始化,可以是Class.forName("com.Test");
2:用户自定义的加载器
java.lang.ClassLoader的子类
用户可以定制类的加载器
Class clazz = Class.forName("java.lang.String");
返回NULL,这个是根类加载器
Class classzz = Class.forName("com.Test");
System.out.println(classzz.getClassLoader);
3: 动态代理实现的接口类InvocationHandler,实现Invoke接口来实现动态代理
LinkageError是加载类出现错误;
类加载器的父委托机制;
4:实例解析
1:目的
类装载器所做的工作实质是把类文件从硬盘读取到内存中;
在这里java采用了委托模型机制,这个机制简单来讲,就是“类装载器有载入类的需求时,会先请示其Parent使用其搜索路径帮忙载入,如果Parent 找不到,那么才由自己依照自己的搜索路径搜索类”,注意喔,这句话具有递归性 :
Bootstrap Loader - 负责加载系统类
|
- - ExtClassLoader - 负责加载扩展类
|
- - AppClassLoader - 负责加载应用类
例子如下:
ClassLoader classloader = JSonParseUtil.class.getClassLoader();
System.out.println("11111=" + classloader);
ClassLoader superClass = classloader.getParent();
System.out.println("2222=" + superClass);
ClassLoader superC1 = superClass.getParent();
System.out.println("3333=" + superC1);
类装载器就是寻找类或接口字节码文件进行解析并构造JVM内部对象表示的组件,在java中类装载器把一个类装入JVM,经过以下步骤:
1、装载:查找和导入Class文件
2、链接:其中解析步骤是可以选择的
(a)检查:检查载入的class文件数据的正确性
(b)准备:给类的静态变量分配存储空间
(c)解析:将符号引用转成直接引用
3、初始化:对静态变量,静态代码块执行初始化工作