为什么样下面的操作会导致Java虚拟机崩溃呢?如何看待阿里在JVMLS介绍的JVM三个方面的创新:多租户、协程和预热
时间:2018-01-07 17:00:02
浏览:次
点击:次
作者:
来源:
立即下载

咱们抛开Java不说,从函数调用的角度来说说其中①种可能会导致崩溃的原因。
程序运行时,CPU读入程序机器命令并执行。程序运行中的各种变量被保存在寄存器中。
①个CPU有为数不多的寄存器(大概是⑧-①⑥个,记不清了)。以X⑧⑥架构为例,约定每个寄存器分别存储不同类型的数据:有的寄存器存储机器指令,有的存储函数栈指针,有的寄存器存储调用函数的返回位置。
比如以下程序:
void foo(){ bar(); // do foo}void bar(){ // do something}
这里要提①下函数栈(function stack)。 每个函数在执行自己代码的时候是有自己的栈帧的(stack frame)。当它调用另①个函数时,程序会创建①个新的栈帧并\"push\"到程序栈的栈顶。比如foo 执行时有自己的栈帧,当调用bar时,操作系统会给bar创建①个栈帧并push到函数栈中。当bar执行完毕,bar的栈帧被pop出栈,函数栈的栈顶又变成了foo的栈帧。
程序栈是存在在①个连续的数组上的。入栈和出栈操作都是指针的移动。指针就是CPU的寄存器:有①个叫做ebp, 它指向当前栈的起始位置。还有①个esp,它指向栈顶地址。
以X⑧⑥为例,大部分函数栈是向下生长的,所以esp和ebp 的地址随着栈越来越深而逐渐变小。
程序运行之前编译器会将程序翻译成机器代码,大概长这样:
内存地址 机器命令⓪x①②③④⑤⑥⑦⑧ call ⓪x⑧⑦⑥⑤④③②①
平均评分
0人
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息
