上一次写了1.初步认识JVM -- JVM序列,今天接着记录写JVM的运行机制。
一、JVM启动流程
Java平台包括JVM以及Java语言,其中JVM也是运行在操作系统中的一个应用程序进程,那么也应该有自己的生命周期以及内存空间。一般情况下java或javac命令执行过程大概如下:
输入java(javac)命令
装载环境以及配置(根据当前路径和系统版本寻找jvm.cfg)
根据配置寻找定位并加载JVM.DLL
初始化JVM获得JNIEnv接口
找到main方法
注意在装载环境以及配置中首先查找jre路径再装载JVM.cfg;之后定位调用系统API加载JVM.dll,至于具体的代码执行流程可以看看****的这篇文章更齐全。
二、JVM基本结构
这个基本结构我从网上爬了张图查看这样比较清楚,如下:
这其中方法区一般是保存装载的类信息:类型的常量池;字段、方法信息;方法字节码(String常量在JDK1.7之后移动堆中)。
java堆应该说是和程序开发最密切相关的区域了,这保存了系统对象凡是new创建的都存储在堆中,不像栈是线程私有的,这堆是所有线程共享,特别需要留意的是GC有分代那么堆也是有分代的。
java栈上面说的是线程私有,栈的空间对于堆来说一般比较小因此存放大对象或数量多是不行的,每次调用方法都会创建一个帧并压栈随后分配栈空间,同时也会拥有一个PC寄存器保存下一条指令的地址(本地方法有区别),存在多个帧时遵循先进后出的原则,这个帧保存了方法的局部变量,操作数栈(java中不存在寄存器概念),常量池等信息,关于局部变量这里需要记住局部变量表中静态方法跟实例方法的区别,举例如下:
public static int runStatic(int i,long l,float f,Object o,byte b){}
局部变量表:int i,long l,float f,Object o,byte b
public int runInstance(char c,short s,boolean b){}
局部变量表:reference this,char c,short s,boolean b
注意:最少4个字节32位,int:32位;float:64位;Object:32位。
-
堆、栈、方法区交互:关于这个交互图我就直接截图了视频的这样看更清晰,如下
这次先到这里。坚持记录点点滴滴!