Java-jvm学习
1:Jvm是什么
Jvm 虚拟机(Java Virtual Machine)字面意思,Java虚拟的机器 ,一种Java,用于计算机设备的规范.
介绍:
Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行。
重点:
Jvm 是Java实现跨平台的基础,只要平台支持Jvm Java语言写的项目就能在此平台上运行.
2:Jvm结构
![](https://img.haomeiwen.com/i5317456/7c404ad29ebf0653.png)
Jvm由 以下几个部分组成
- 类加载器(.class类加载)
- 运行时数据区(运行时数据存储,分为方法区,堆,java栈,本地方法栈,程序计数器)
- 执行引擎本(执行字节码或者执行本地方法)
- JNI(Java Native Interface)本地地方法接口
- Native Library 本地方法库 C/C++实现的一些库
3:类加载器
类加载器:
类加载器是Jvm提供的一种类加载的机制. 类加载器负责将class文件加载到内存中,转化为可执行对象.所有类都是由类加载器加载的
类加载器还负责解析类的依赖关系,即加载所需的其他类。
类加载器分类
- Bootstrap Class Loader 启动类加载器又称跟加载器
- Extension Class Loader 扩展类加载器
- Application Class Loader 程序类加载器
- 自定义加载器(处理业务需要加密等特殊的加载器)
3.1 Bootstrap Class Loader启动类加载器
Bootstrap Class Loader 启动类加载器,又称跟加载器,是最顶层的加载器.是由C++实现,负责加载Java的核心类,%JAVA_HOME%/lib目录下的核心jar包和类或者或被 -Xbootclasspath参数指定的路径中的所有类,例如:java.lang.Object
3.2 ExtensionClassLoader 扩展类加载器:
主要负责加载目录 %JRE_HOME%/lib/ext 目录下的jar包和类,或被 java.ext.dirs 系统变量所指定的路径下的jar包。
3.2 AppClassLoader 应用程序类加载器:
面向我们用户的加载器,负责加载当前应用classpath下的所有jar包和类。
除了这三个主要的类加载器,Java还支持自定义类加载器,开发人员可以根据需要实现自己的类加载器。
注意:
除了 BootstrapClassLoader 其他类加载器均由 Java 实现且全部继承自java.lang.ClassLoader
3.3 类生命周期
![](https://img.haomeiwen.com/i5317456/1662a3475a44bfc7.png)
一个类的生命周期,就是类加载器加载到卸载一个类的过程.
类的生命周期可以分为以下几个阶段:
- 加载(Loading)
根据类的全限定名(包括包路径和类名)定位并读取类文件的字节码。 - 验证(Verification)
校验类是否符合jvm规范 - 准备(Preparation)
为静态变量赋予默认值,这些内存都将在方法区中分配
注意:
静态变量复制,0,null,""等
final修饰的直接赋值而不是赋予默认值 - 解析(Resolution)
将常量池中的符号引用替换为直接引用(内存地址)的过程.
符号引用就是一组符号来描述目标,可以是任何字面量。属于编译原理方面的概念如:包括类和接口的全限定名、字段的名称和描述符、方法的名称和描述符。
直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。如指向方法区某个类的一个指针
个人理解就是将常量池中的对象,通过一个指针空间地址值对象化. - 初始化(Initialization)执行类的初始化代码,包括静态变量的赋值和静态块的执行
为静态变量赋值
赋初值两种方式:
定义静态变量时指定初始值。如 private static String x="123";
在静态代码块里为静态变量赋值。如 static{ x="123"; }
注意:只有对类的主动使用才会导致类的初始化
- 使用(Using) 被引用的时候就是在使用
- 卸载(Unloading)
执行了System.exit()方法, 程序正常执行结束
程序在执行过程中遇到了异常或错误而异常终止
由于操作系统出现错误而导致Java虚拟机进程终止
3.4 类加载机制-双重委派机制(爹来模式)(重要)
类加载器采用了双亲委派模型(Parent Delegation Model)来加载类。
即当一个类加载器需要加载类时,自身不会加载会首先发送给父类加载,父类要是还有父类就会依次向上传递,父类不能加载会返回给子类,子类加载,子类也加载不了会抛出ClassNotFoundException异常
好处:
确保类只加载一次