Java/.Net双平台核心,Jvm和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函数继续执行。关于这一点可以参照以前的文章:点击查看原理
结尾:
作者:江湖评谈
关注我,带你了解高价值和好玩的技术

Java/.Net双平台核心,Jvm和CLR运行异同点的更多相关文章
- Java魔法堂:JVM的运行模式
一.前言 JVM有Client和Server两种运行模式.不同的模式对应不同的应用场景,而JVM也会有相应的优化.本文将记录JVM模式的信息,以便日后查阅. 二.介绍 在$JAVA_HOME/jre/ ...
- Java魔法堂:JVM的运行模式 (转)
一.前言 JVM有Client和Server两种运行模式.不同的模式对应不同的应用场景,而JVM也会有相应的优化.本文将记录JVM模式的信息,以便日后查阅. 二.介绍 在$JAVA_HOME/jre/ ...
- Error: could not open `C:\Program Files\Java\jre6\lib\i386\jvm.cfg')
前些日子装了个jdk7试了试,后来做项目需要换成jdk6,安装完jdk6,设置完环境变量后出现问题.运行java -version出现Error: could not open `C:\Program ...
- Java 内存管理、JVM 工作原理与 Java 运行时系统
Java 虚拟机规范中说明:所有的对象实例(all class instances)以及数组都要在堆上分配: the heap is the runtime data area from which ...
- [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义
前言简介 class文件是源代码经过编译后的一种平台中立的格式 里面包含了虚拟机运行所需要的所有信息,相当于 JVM的机器语言 JVM全称是Java Virtual Machine ,既然是虚拟机, ...
- 【基本功】Java动态追踪技术探究 不重启JVM,替换掉已经加载的类?不重启JVM,获知运行时对象的属性
https://mp.weixin.qq.com/s/_hSaI5yMvPTWxvFgl-UItA 小结: 1.根据Java的类加载机制,在同一个ClassLoader中,类是不允许重复的: 2.单例 ...
- JVM(二),Java怎样实现一次编译到处运行(平台无关性)
二.Java怎样实现一次编译到处运行(平台无关性) 1.java平台无关性原理 Java源码首先被编译成字节码,再由不同平台的JVM进行解析,JAVA语言在不同的平台上运行时不需要进行重新编译,Jav ...
- JVM内存结构——运行时数据区
在Java虚拟机规范中将Java运行时数据划分为6种,分别为: PC寄存器(程序计数器) Java栈 堆 方法区 运行时常量池 本地方法栈 一.PC寄存器(程序计数器) PC寄存器(Program C ...
- 【java虚拟机系列】java虚拟机系列之JVM总述
我们知道java之所以能够快速崛起一个重要的原因就是其跨平台性,而跨平台就是通过java虚拟机来完成的,java虚拟机属于java底层的知识范畴,即使你不了解也不会影响绝大部分人从事的java应用层的 ...
- Java工作原理:JVM,内存回收及其他
JAVA虚拟机系列文章 http://developer.51cto.com/art/201001/176550.htm Java语言引入了Java虚拟机,具有跨平台运行的功能,能够很好地适应各种We ...
随机推荐
- vue项目中配置scss
之前创建 vue 项目的时候没有选择 scss 预编译,现在项目中要使用,不知道如何配置,网上搜了下全都是: npm install sass-loader --save-devnpm instal ...
- VRRP原理和实战
一.VRRP基本概述 ·VRRP能够在不改变组网的情况中,将多台路由器虚拟成一个虚拟路由器,通过配置虚拟路由器的IP地址为默认网关,实现网关的备份. ·协议版本:VRRPv2(常用)和VRRPv3 · ...
- Win10下SDK Manager应用程序闪退问题的解决方法
SDK Manager闪退原因:未找到Java的正确路径 解决办法: 1.在压缩包中找到Android.bat文件,右键编辑 2.打开的Android文件内容,找到如图的几行代码 将上面的代码替换成: ...
- 11、ON DUPLICATE KEY UPDATE实现插入更新操作
一.插入与更新操作: MySQL中,采用ON DUPLICATE KEY UPDATE语句对不存在的数据进行INSERT插入操作,对已存在的数据进行UPDATE更新操作: 总结: 1.ON DUPLI ...
- 【架构设计】保持简单轻量设计的三个原则——DRY,KISS, YAGNI
前言 一个软件轻量简单的软件架构是非常重要的,它可以让我们花最小的代价就能满足业务上的需求.那如何保证轻量简单呢?那今天就和大家分享下这其中的秘密,也就是3个重要的指导原则,KISS原则,YAGNI原 ...
- CentOS7升级Linux内核
CentOS7升级Linux内核 什么是Linux内核 虽然时候使用 Linux 来表示整个操作系统,严格地说,Linux 只是个内核,而发行版的操作系统是一个完整功能的系统,它建立在内核之上,具有各 ...
- Java内存区域有哪些构成?
目录 前言 Java 内存区域 程序计数器 虚拟机栈 本地方法栈 堆 方法区 字符串常量池 运行时常量池 直接内存 小结 作者:小牛呼噜噜 | https://xiaoniuhululu.com 计算 ...
- python进阶之路8 字典、元组、集合内置方法 编码理论
内容回顾 作业讲解 1.前期不熟练的情况下一定要先写注释 2.一定要仔细思考每一行代码的含义 3.自己不会的代码或者不熟练的代码一定要多敲多练 数据类型内置方法简介 所有的数据类型基本上都自带了一些操 ...
- 一文读懂Go Http Server原理
hello大家好呀,我是小楼,这是系列文<Go底层原理剖析>的第二篇,依旧是分析 Http 模块,话不多说,开始. 从一个 Demo 入手 俗话说万事开头难,但用 Go 实现一个 Http ...
- Linux操作系统导学专栏(一)——专栏要讲些什么?
该专栏是为Linux内核开发编程做铺垫,如果你对操作系统很熟悉,想了解一些Linux内核发开的知识,请直接跳转至<Linux内核编程专栏>,如果你对Linux内核编程也很熟悉,想了解L ...