启动流程、基本结构、类加载器
一、JVM启动流程
1、执行命令,java -jar 启动
2、装载配置,根据当前路径和系统版本寻找jvm.cmg
3、根据配置寻找JVM.dll
4、初始化JVM获得JNIEnv接口,JNIEnv为JVM接口,findClass等操作通过它实现
5、找到main方法并运行
二、JVM基本结构
1、通过类加载器加载子系统(双亲委托机制)
2、加载进内存空间
内存空间有方法区、java heap、java stack、native method stack
垃圾收集器
3、其他
通过PC寄存器 地址 给方法区
执行引擎 与 内存 交互 数据和指令
本地方法接口 本地方方法栈 本地方法库
PC寄存器:
每个线程拥有一个PC寄存器
在线程创建时 创建
指向下一条指令的地址
执行本地方法时,PC的值为undefined
方法区:
保存装载的类信息
类型的常量池
字段,方法信息
方法字节码
通常和永久区(Perm)关联在一起
JDK6时,String等常量信息置于方法,JDK7时,已经移动到了堆
Java堆
和程序开发密切相关
应用系统对象都保存在Java堆中
所有线程共享Java堆
对分代GC来说,堆也是分代的
GC的主要工作区间
Java栈
线程私有
栈由一系列帧组成(因此Java栈也叫做帧栈)
帧保存一个方法的局部变量、操作数栈、常量池指针
每一次方法调用创建一个帧,并压栈
三、类加载器
1、描述下jvm加载class
JVM中类的装载是由类加载器(ClassLoader)和它的子类完成的,java中类加载器是一个重要的java运行时的组件,他负责在运行时查找和装入类文件中的类。
由于java的跨平台性,经过编译的java源程序并不是一个可执行程序,而是一个或多个类文件。
当java程序需要使用某个类时,jvm会确保这个类已经被加载、连接(验证、准备和解析)和初始化。
类的加载是指把类的.class文件中的数据读入到内存中。
通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的class对象。
加载完成后,class对象还不完整。所以此时的类还不可用。
当类被加载后就进入连接阶段,这一阶段包括验证、准备和解析三个步骤。最后jvm对类进行初始化,包括:
如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类
如果类中存在初始化语句,就依次执行这些初始化语句。
类的加载是由类加载器完成的,类加载器包括:根加载器(BootStrap)、扩展加载器(Ext)、系统加载器和自定义加载器。
在连接阶段一般是无法干预的,大部分干预 类加载阶段,对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性
,类加载时候重要三个方法:
1、public Class<