经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
Java/.Net双平台核心,Jvm和CLR运行异同点
来源:cnblogs  作者:江湖评谈  时间:2023/3/3 8:53:31  对本文有异议

前言:

本篇以.Net 7.0.2 CLR 和 OpenJDk19参照,解析下它们各自调用函数的异同。
以下为个人理解。


概述

JDK大约5.9G,CLR大约7.6G,两者相差1.7G左右。

  1. root@tang-virtual-machine:/home/tang# cd jdk-jdk-19-36
  2. root@tang-virtual-machine:/home/tang/jdk-jdk-19-36# du -sh
  3. 5.9G .
  4. root@tang-virtual-machine:/home/tang/Downloads# du -sh
  5. 7.6G .

JVM事先把需要运行的函数编译好存放在某个地址,此后通过呼叫桩(call_stub)进行调用,这里的某个地址里面包含了需要运行的函数头地址,在里面跳转运行。
CLR是一边运行一边编译,遇到哪个函数就编译哪个,编译完成后跳转到此函数的函数头(pCode)地址进行运行。


具体的呢?先看JVM,它的调用如下

  1. Main-》-》Clone3-》JavaMain-》InitializeJVM-》create_vm-》init_globals-》generate_call_stub() //这里省略了部分

generate_call_stub函数对需要运行的函数进行编译,它的代码实际上是生成机器码,然后返回函数桩头

  1. StubRoutines::_call_stub_entry = generate_call_stub(StubRoutines::_call_stub_return_address);
  2. _call_stub_entry

也就是call_stub接受的那个地址。_call_stub_entry里面包含了需要运行函数的函数头地址,在call_stub里面进行地址跳转调用。此处可以的原理可以看下以前文章:点击此处查看原理


那么call_stub的调用是什么呢?

  1. Main-》-》Clone3-》JavaMain-》InitializeJVM-》create_vm-》initialize_java_lang_classes-》call_stub

可以看到generate_call_stub和call_stub两者在create_vm函数处分为两处,首先调用了generate_call_stub对函数进行了编译,再调用call_stub对编译好的函数进行了调用。


再看CLR,以调用托管的Main函数入口为例。常例,先看下它的调用

  1. Main-》RunMain-》MethodDescCallSite::Call-》MethodDescCallSite::CallTargetWorker-》CallDescrWorkerWithHandler-》CallDescrWorkerInternal-》ThePreStub-》PreStubWorker

如果Main函数里面调用了其它函数,比如如下:

  1. static void Main(string[] args)
  2. {
  3. Console.Write("Tian xia feng yun chu wo bei");
  4. }

Main里面调用了Console.Write函数,当CLR运行到此函数处,又把上面的调用运行了一边

  1. MethodDescCallSite::Call-》MethodDescCallSite::CallTargetWorker-》CallDescrWorkerWithHandler-》CallDescrWorkerInternal-》ThePreStub-》PreStubWorker

直到Console.Write函数编译和运行都完毕,才返回Main函数继续执行。关于这一点可以参照以前的文章:点击查看原理


结尾:

作者:江湖评谈
关注我,带你了解高价值和好玩的技术
image

原文链接:https://www.cnblogs.com/tangyanzhi1111/p/17170961.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号