致力于高质量的博文分享
jvm本以为是老生常谈,快7年止痒的时候,往往会蹦出新鲜玩意,让你眼前一亮;这……(台词到位,灯光准备)就是技术的力量,我骄傲!
首先感谢拉钩教育张雷老师《32个java面试必考点》和李国老师《深入浅出java虚拟机》的教导,同时也感谢各位同仁在网络上的分享!
盗取灵芝图一张
jvm内存模型
程序计数器:线程私有,记录虚拟机字节码指令的地址,当前的执行进度
唯一不出现outOfMemoryError的内存区域,生命周期这么悲伤的事情我其实不想讲,诶,跟所属线程一样一样的(后面的私有你懂的)
较小的内存空间,当前线程执行字节码的行号指示器,通过改变该值选取下一条要执行的字节码指令:分支、循环、挑战、异常处理、线程恢复等
虚拟机栈:线程私有,方法执行时创建栈帧储存局部变量/操作数/动态链接/方法返回地址
局部变量表:编译期可知的基本数据类型/对象引用类型/returnAddredd类型;表大小不可变
操作数栈:后进先出LIFO;深度由编译期决定,且任意时刻深度固定,基本数据类型long double占两深度其他1个;存放上表复制的变/常量,提供提取,结果入栈,存参数,接收返回值(这是一个动态的过程,网上资料很多,很简单比较有意思就不介绍了,加油/你是最胖的)
动态链接:这个不太好说,先看方法返回值(没错赤裸裸的逃避)
方法返回地址:
退出方法:1、执行引擎遇到返回字节码指定,一般来说调用者PC计数器的值可作为返回地址;2、遇到方法体内没有处理的异常,此时通过异常处理器确定返回地址,既然你要耍脾气我栈帧可不记录你
正常返回时为了程序正确进行,退出时可能要恢复上层方法的局部变量/操作数栈,有返回值则将其压入调用者操作数栈,调用pc计数器的值来指向后面的指令
本地方法栈