JVM启动流程
其中jvm.cfg是jvm的配置文件
JVM基本结构
PC寄存器
每个线程拥有一个PC寄存器,在线程创建时创建,指向下一条指令的地址。如果是执行本地方法时,PC的值为undefined。
想一下为什么jvm虚拟机只有一个寄存器——PC寄存器?
因为JVM是软件虚拟,无法使用寄存器的硬件优势,所以JVM本就不存在真正意义上的寄存器。
内存空间
方法区
保存装载的类信息(类的元信息)
- 类型的常量池
- 字段,方法信息
- 方法字节码
通常和永久区(Perm)关联在一起
这里可以注意一个细节对于String的常量,在jdk7的时候由原来不存在方法区的常量池中修改为保存在堆中常量池。
java堆
java堆是线程共有的区域,应用系统对象保存在java堆
java栈
java栈是线程私有的,主要保存的单元是栈帧,栈帧由局部变量表,操作数栈,帧数据区组成。
局部变量表包含——局部变量以及函数参数
操作数栈包含——计算过程中的中间结果
帧数据区——保存访问常量池的指针,已经对异常处理的时候需要的异常处理表也在帧数据区。
栈上分配
栈上分配指java虚拟机提供的一项优化技术,它的基本思想是:对于哪些线程私有的对象(不可能被其他线程访问),可以将它们打散分配在栈上,而不是分配在堆上。这样的好处是不需要GC的介入,当函数返回的时候自动销毁栈上的数据。
栈上分配的基础是进行逃逸分析,这里举个例子:
对于第二个函数的user虚拟机进行有化的化,就会在栈上分配。
栈、堆、方法区交互
举个例子:
JVM内存模型
参考: