深入探讨虚拟机运行时的java线程栈帧、Java/JVM沟通(7)
2023-04-29 来源:飞速影视
代码清单4-19 JavaCalls方法调用
void JavaCalls::call_helper(...) {...// 调用函数指针_call_stub_entry,把实际的函数调用工作转交给它{ JavaCallWrapper link(method, receiver, result, CHECK);{ HandleMark hm(thread);StubRoutines::call_stub()((address)&link,result_val_address,result_type,method(),entry_point,args->parameters(),args->size_of_parameters(),CHECK);...}}}严格来说,call_helper还没有做方法调用,它只是检查方法是否需要编译,验证参数是否正确等,最终它会跳转到函数指针_call_stub_entry处,把方法调用这件事又转交给_call_stub_entry。
_call_stub_entry由generate_call_stub()生成,这是一个运行时代码生成的过程,会在本书后面数次遇到,简单来说是虚拟机在初始化阶段为这些stub生成一段固定的机器代码,并放入内存,后续可以跳转到这段内存,将数据当作代码执行。
_call_stub_entry会调用Java方法,而调用Java方法前需要建立栈帧,所以它也会负责栈帧的创建。这个栈帧里面保存了一些重要的数据,包括Java方法的参数和返回地址。当一切准备就绪,就可以调用Java方法了。需要注意的是,Java方法不是机器代码,不能被CPU直接执行,这里说的调用Java方法更确切来说是跳转到解释器入口entry_point处,由解释器解释执行Java方法,如图4-10所示。
本站仅为学习交流之用,所有视频和图片均来自互联网收集而来,版权归原创者所有,本网站只提供web页面服务,并不提供资源存储,也不参与录制、上传
若本站收录的节目无意侵犯了贵司版权,请发邮件(我们会在3个工作日内删除侵权内容,谢谢。)
www.fs94.org-飞速影视 粤ICP备74369512号