前言:

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

以下为个人理解。

概述

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

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

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

CLR是一边运行一边编译,遇到哪个函数就编译哪个,编译完成后跳转到此函数的函数头(pCode)地址进行运行。

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

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

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

StubRoutines::_call_stub_entry = generate_call_stub(StubRoutines::_call_stub_return_address);
_call_stub_entry

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

那么call_stub的调用是什么呢?

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函数入口为例。常例,先看下它的调用

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

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

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

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

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

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

结尾:

作者:江湖评谈

关注我,带你了解高价值和好玩的技术

最新文章

  1. SQL SQL语句的增删改查
  2. oop五大设计原则
  3. 用户图形界面(GUI)学习笔记(一)——Swing与AWT
  4. linux查看及改变运行级别
  5. [Compose] 21. Apply Natural Transformations in everyday work
  6. ZeroMQ(java)之负载均衡
  7. android-ramdisk.img分析、recovery.img&boot.img执行过程
  8. HDU4857——逃生(反向建图+拓扑排序)(BestCoder Round #1)
  9. [转]CENTOS6 VNCSERVER安装
  10. VS2013无法链接到TFS (转)
  11. angularjs中使用轮播图指令swiper
  12. vue.js实例对象+组件树
  13. 面嚮對象程序設計第一單元作業——OO初試
  14. Ext 日期格式化
  15. Find the Missing Number II
  16. 跨时代的分布式数据库 – 阿里云DRDS详解(转)
  17. 面试题之O(n)内旋转字符串
  18. HDU 1229 还是A+B(A+B陶冶情操)
  19. 微信公众号发送消息模板(java)
  20. RestClient POST

热门文章

  1. Python异步爬虫(aiohttp版)
  2. 嵌入式Linux Qt移植详细过程
  3. ORM增删改查 django请求生命周期图 django路由层及反向解析
  4. python实现单向循环链表与双向链表
  5. 激光炸弹【算法竞赛进阶指南, HNOI2003】
  6. 单向绑定vs双向绑定、单向数据流vs双向数据流
  7. Java解题练习
  8. 在GCP上创建Cloud SQL的三种方式(Console,gcloud,Terraform)
  9. 第三方模块的下载与使用 requests模块 openpyxl模块
  10. 目标检测+双目测距——基于yolov5