首页 > 编程语言 >Java/.Net双平台核心,Jvm和CLR运行异同点

Java/.Net双平台核心,Jvm和CLR运行异同点

时间:2023-03-02 11:24:11浏览次数:47  
标签:调用 Java 函数 stub call Jvm Net Main CLR

前言:

本篇以.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函数继续执行。关于这一点可以参照以前的文章:点击查看原理


结尾:

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

标签:调用,Java,函数,stub,call,Jvm,Net,Main,CLR
From: https://www.cnblogs.com/tangyanzhi1111/p/17170961.html

相关文章

  • JAVA设计模式之单例模式
    设计模式设计模式(DesignPattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及......
  • 《netty实战》10-11章
    第10章编解码器框架                                    第11章预置的ChannelHandler......
  • rinetd端口转发
    简介Rinetd是为在一个Unix和Linux操作系统中为重定向传输控制协议(TCP)连接的一个工具。Rinetd是单一过程的服务器,它处理任何数量的连接到在配置文件etc/rinetd中指定的......
  • 剑指 Offer 64. 求 1 + 2 + … + n(java解题)
    目录1.题目2.解题思路3.数据类型功能函数总结4.java代码1.题目求1+2+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C......
  • 《netty实战》笔记 1-8章
    第1章            此方式(javaAPI阻塞方式):一个客户端——一个线程当客户端连接非常多时很不理想 JavaNIO——非阻塞      ......
  • ASP.NET Core - 配置系统之配置读取
    一个应用要运行起来,往往需要读取很多的预设好的配置信息,根据约定好的信息或方式执行一定的行为。配置的本质就是软件运行的参数,在一个软件实现中需要的参数非常多,如果我们......
  • java中listmap根据map某一字段排序公共方法
    /***List<Map>根据map字段排序**@paramlist*@paramfeild排序字段*@paramsortTyp排序方式desc-倒序asc-正序*@return......
  • JavaScript的Dom基本操作
    获取元素的方式:根据id名称获取   document.getElementById("id名称")根据元素类名获取    document.getElementsClassName("元素类名")根据元素标......
  • dotnet-cnblogs-tool 工具使用
    工具的作用在下面第一部分原作者的GitHub说明和博客中有介绍,此文中就不在说明。目录一、DotNet博客园图片上传工具二、dotnet-cnblogs安装与使用三、快捷方式的分享点四......
  • 【译】.NET 7 中的性能改进(九)
    原文|StephenToub翻译|郑子铭原始类型和数值(PrimitiveTypesandNumerics)我们已经看过了代码生成和GC,线程和矢量化,互操作......让我们把注意力转向系统中的一......