[讨论] [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 不是这样弄得 |
相关讨论
相关资源推荐
- JDK21协程-虚线程 openjdk源码解读 底层从Java代码到C/C++代码初次深度解读 虚线程调优
- Java并发系列(15)——synchronized之HotSpot源码解读(中)
- CentOS7编译安装OpenJDK8
- 如何优雅的编译OpenJDK(Mac 版)
- 看图学源码之 synchronized源码解析二: HotSpot 的 源码解析
- Hotspot synchronized与volatile关键字实现(二) 源码解析
- 【并发编程】 --- 从JVM源码的角度进一步去理解synchronized关键字的原理
- OpenJDK9 Hotspot :oops,klass 与 handle
- 调试openjdk11源码报段错误异常Segmentation fault解决方案
- (三)死磕并发之深入Hotspot源码剖析Synchronized关键字实现