[讨论] [HotSpot VM] 有人知道在OpenJDK的源码中,哪个程序是把frame压入stack的?

huangriyan 2014-11-27
有人知道在OpenJDK的源码中,哪个程序是吧frame压入stack的。
我跟踪了源码很久,就是没有办法找到对应的代码,有知道的大牛吗?
RednaxelaFX 2014-11-29
huangriyan 写道
有人知道在OpenJDK的源码中,哪个程序是吧frame压入stack的。我跟踪了源码很久,就是没有办法找到对应的代码,有知道的大牛吗?

楼主问的是什么意义上的frame?

如果说的是普通的call stack frame的话,所谓的“push”就是调整一下栈指针而已。在x86上就是:
sub esp, <frame_size>

或者64位x86:
sub rsp, <frame_size>

或者如果有一些特定的值要压到栈上的话,会有一组连续的push指令。

其对应的源码在解释器、编译器里都有。
解释器的普通入口:
http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/file/38294f25c7a8/src/cpu/x86/vm/templateInterpreter_x86_32.cpp#l1331
这个generate_fixed_frame()里面有生成解释器栈帧的固定大小部分的代码。可以看到它有生成一连串的push指令,每条push指令将栈帧的一个字段压入栈中。

C1编译的方法的入口:
http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/file/38294f25c7a8/src/cpu/x86/vm/c1_MacroAssembler_x86.cpp#l367
decrement(rsp, frame_size_in_bytes);

这句代码会生成出前面说的sub rsp, <frame_size>的代码。

C2编译的方法的入口:
http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/file/38294f25c7a8/src/cpu/x86/vm/x86_32.ad#l563
这个verified_entry()里有
subptr(rsp, framesize)

同样会生成前面说的sub rsp, <frame_size>的代码。
huangriyan 2014-12-01
   多谢R大的指点。
    我又看了的源码,好像所谓frame压入栈中,并不是一次按framesize 移动rsp,而是通过压入输入参数、移动rsp,如移动 local var count 长度等方式一点点完成 frame 的分配,不知这样理解对不对。
    之前我看了kvm 的方法 frame 貌似是从进程堆中分配一个framesize空间的,我一直也按这思路看openjdk的源码,以为其也是一次性在线程栈空间中直接一次性分配framesize 的空间。现在看来openjdk 不是这样弄得
Global site tag (gtag.js) - Google Analytics