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