JVM启动流程
- java命令接一个带有main方法的启动类
- 首先装载配置,根据版本号等信息查找JVM配置文件jvm.cfg
- 根据配置文件定位需要的dll(jvm.dll)
- 从dll初始化虚拟获得相关的接口(JNIEnv),比如findclass等
- 找到main方法并运行
JVM基本结构
PC寄存器:指向下一条指令的地址,每个线程拥有一个PC寄存器,在线程创建时创建,执行本地方法时,PC值为undefined未定义
方法区:保存装载的类信息,如类型的常量池(JDK7移动到了堆)、字段、方法信息、方法字节码,通常和perm永久区关联在一起
Java堆:(实例域、静态域、数组元素)应用系统对象都保存在Java堆中,所有线程共享Java堆,GC回收
Java栈:线程私有,自动回收,不会发生内存泄漏,由一系列帧组成,每个帧保存一个方法的局部变量表(参数、局部变量)、栈操作数(Java没有寄存器,参数传递使用)、常量池指针,每一次方法调用创建一个帧,并压栈
栈上分配:小对象在没有逃逸的情况下,可以直接分配到栈上,减轻GC压力
递归次数太多,可能发生栈溢出,要让递归被更多的调用:
1、增大栈空间,设置xss
2、减小局部变量表,如少用double和long,减少参数个数,减少局部变量,注意局部变量的作用域