CLR和JVM调用函数的异同点
JVM 异同 调用函数 CLR
2023-06-13 09:18:11 时间
前言: 本篇以.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函数继续执行。关于这一点可以参照以前的文章:点击查看原理
结尾: 简单的概括下就是,JVM是先编译后运行。CLR是一边运行一边编译。 作者:江湖评谈
相关文章
- 来聊聊 OpenJDK 和 JVM 虚拟机
- tomcat8 JVM 优化
- JAVA JVM 优化「建议收藏」
- JVM内存模型详解「建议收藏」
- JVM之内存模型与线程
- JVM 学习笔记(4):内存分配与回收策略
- 【说站】java之JVM的字节码结构
- jvm基础_java实现栈四个方法
- 1-JVM基础
- jvm的垃圾回收机制是什么_垃圾回收过程图片
- JVM 一张图带你了解内存分配过程 搞懂逃逸分析|标量替换|指针碰撞|空闲列表|TLAB
- JVM:内存管理
- 【Java 虚拟机原理】栈帧 | 局部变量表 | 操作数栈 | 方法出口 | JVM 指令逐条解析
- Hbase JVM优化详解大数据
- JSTATD结合Java VisualVM进行远程监控JVM运行情况详解编程语言
- jvm看java.lang.OutOfMemoryError: PermGen space详解编程语言
- Jvm介绍详解编程语言
- Linux监控JVM系统性能优化实战(linux监控jvm)
- Linux查看JVM内存使用情况指南(linux查看jvm内存)
- 参数Linux下修改JVM参数的指南(linux修改jvm)
- Linux 系统 JVM 日志分析指南(linux jvm 日志)
- JDK文档Oracle全面解读JVM(jvm文档oracle)
- Oracle宣布JVM规范化(jvm规范oracle)
- 解锁Oracle指引你的JVM下载之旅(jvm下载oracle)
- Oracle JVM安装指南(oracle jvm安装)
- 在Oracle JVM环境下进行下载的指南(oracle jvm下载)