java虚拟机是什么?
- 抽象规范 仅仅是一种概念
-
一个具体的实现 可能来自多个提供商或者运行在多个平台上
- 一个运行中的虚拟机实例 当运行一个java程序的同时,其实就是运行了一个java虚拟机实例
Java虚拟机的生命周期
java虚拟机有两种线程:守护线程和非守护线程
- 守护线程:java虚拟机自己使用的,比如垃圾回收器
- 非守护线程:当运行程序中如果非守护线程执行完毕,那么java虚拟机实例将退出。main方法就是非守护线程
Java虚拟机的体系结构
运行时数据区:以某种形式存在于每一个java虚拟机视线中,规范描述很抽象,具体的细节是由实现的设计者决定的。每个虚拟机实例都有一个方法区和一个堆,他们是线程共享的,class的类型信息会解析存放到方法区(持久代,但是只是sun官方的实现是这种情况,其他的虚拟机没有,而且后期规划可能将持久代放入本地方法区),当运行是创建的对象会放入堆中(这个是我们创建的堆内存,-Xmx,-Xms,连续的内存空间)。每个线程访问的时候会创建属于自己的程序计数器(pc寄存器)以及java栈(虚拟机栈),java栈是由多个栈帧组成,每个栈帧都代表一个方法,当一个方法执行完毕,那么一个栈帧也将被抛弃。栈是先进后出的。那么表示如果方法里面调用方法,那么方法里面的方法栈先释放,最后才释放最先调用的方法。
类装载器:每个java虚拟机都有一个类装载子系统,他根据给定的全限定名来装入类型(类或接口)
执行引擎:每个java虚拟机都有一个执行引擎,负责执行那些包含在被包含在 被装载类的方法中的指令
方法区:
- 运行常量池
- 方法信息
- 除了常量以外的所有类变量
- 一个到类classLoader的引用
- 一个到class类的引用
堆:
寄存器:program counter register(程序计数器),每一个新程序创建时,都将得到自己的寄存器以及一个java栈
java栈:
本地方法栈: