JVM架构哪些事
JAVA虚拟机
每一个java程序都是运行在某个具体的java虚拟机实现的实例上,一个java虚拟机负责运行一个java程序,当启动一个java程序的时候,一个虚拟机就诞生了,当该程序关闭时,这个虚拟机实例也就随之消亡。
1 JVM线程
- 守护线程;通常是虚拟机自己使用,比如GC线程,但是java程序可以将自己的线程设置为守护线程,但是必须在start()方法之前调用
- 用户线程:即main方法执行的线程
当程序中所有的非守护线程(即用户线程)都结束时,虚拟机实例将自动退出。因而,守护线程不适合做IO操作,因为守护线程是在所有的非守护线程推出后结束,这样并不能代表守护线程是否完成了相应的操作,如果非守护线程退出后,还有大量的数据没有写,将会引发数据丢失问题
2 JVM结构
-类装载子系统
每一个JVM都有一个类装载系统,它会跟著给定的全限定名来装载类型、class文件等
- 执行引擎
每一个JVM都有一个执行引擎,他负责执行哪些包含在装载类中的指令
- 运行时数据区
当JVM运行一个程序的时候,它需要内存来进行存储很多的东西,比如计算时的中间变量,程序创建的对象,返回值等等,运行时数据区就类似于内存,存存这些东西,每个运行区包含方法区,堆,JAVA栈,PC寄存器,本地方法栈等
(1)当虚拟机装载一个class文件时,它会从class文件包含的二进制数据中解析类型信息,然后将这些信息放在方法区中(2)当程序运行的时候,虚拟机就会把所有线程在运行时创建的对象都放在堆中
(3)如果线程正在执行的是一个JAVA方法,那么寄存器的值(程序计数器)总是指向下一条将被执行的指令
(4)JAVA栈则总是存储该线程中JAVA方法调用的转台--包括它的局部变量、被调用时传进来的参数、返回值、以及中间结果等等。JAVA栈是由很多的栈帧或这说是帧等组成,一个栈帧包含一个方法调用状态,当现场调用一个JAVA方法的时候,虚拟机压入一个方法到该线程的JAVA栈中,当方法返回时,这个栈帧就会从JAVA栈中弹出并抛弃
3 类加载器
JAVA类加载器是JAVA运行时环境的一部分,负责动态的将JAVA类加载到JAVA虚拟机的内存空间中,类通常是按需加载,即第一次使用该类时才加载,类装载系统除了要定位和导入二进制class文件外,还必须验证被导入类的数据的正确性,为变量分配初始化内存,以及帮助解析符号引用等,这些动作按照以下循序执行
(1)装载-查找并装载二进制数据
(2)链接-执行验证、准备等
(3)初始化
4 启动类装载器
由原生代码c++编写,它负责加载核心JAVA库
5 用户自定义类装载器
继承classloard类,用户自定义的类装载器