CLR和JRE的运行机制的初步总结

jdk、jre、jvm分别是什么?有什么联系? JDK:是Java Development Kit的缩写,是Java的开发工具包,JDK是整个JAVA的核心。它提供了编译、运行Java程序所需的各种工具和资源。有了它,Java开发者就可以编译和运行自己的Java程序。它包含的javac指令是用来将.java文件编译成.class文件的,这是开发者需要的编译,而用户(只需要运行程序的人)是不需要的。它包含了JREJRE:Java的运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器),只是针对于使用Java程序的用户。 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 概念比较: Java C# byte code IL(字节码,中间语言) jvm.dll mscrolib.dll,mscrojit.dll(虚拟机) JRE CLR(运行环境) JDK .Net Framework(开发框架) package assembly(类库,程序集) 一、关于类库的版本管理问题 Java和C#代码运行要依靠其运行环境(JRE,CLR)和运行环境带的基础类库(C#称为配件或者程序集Assembly),此外还会有一些第三方的类库或者自己开发的类库。如果运行环境版本不一致,或者引用的类库版本不一致都会带来程序不能正常运行。比如一个Java程序是在JDK1.2上开发,如果在JRE1.4上运行,一般情况下可以向下兼容,但也有例外,有些GUI程序在JDK1.4上面运行结果很可能会不同。 JRE的版本管理 Java的解决办法是每个程序自己携带一套JRE。 我的机器上已经被安装了好多套JRE和JDK了(JDK包括了同版本的JRE,此外还包括有编译器和其它工具),它们分别是: BEA Weblogic Server 7.0 自带一套 JDK1.3.1_02 我下载了一套最新的JDK1.4.1_02 JBuilder9自带一套JKD1.4.1_02 Oracle8.1.7自带一套JRE1.1.7 Ration Rose自带一套JDK1.3 DreamWeaver自带一套JDK1.3 6套JRE,每套JRE都被各自安装到不同的目录,不会互相影响。当在控制台执行java.exe,操作系统寻找JRE的方式如下: 先找当前目录下有没有JRE 再找父目录下有没有JRE 接着在PATH路径中找JRE 注册表HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java Runtime Environment/ 查看CurrentVersion的键值指向哪个JRE 最常用的是在PATH路径中找JRE,一般情况下,自己的程序运行之前都会先在批处理文件里面临时设置PATH,把自己用的JRE放到PATH路径最前面,所以肯定会运行自己带的JRE,不会造成版本混乱。 .Net Framework的版本管理 .Net Framework被固定安装在C:/Winnt/Microsoft.NET/Framework/v版本号/目录下,并且在同一台机器只能安装一套,要安装1.1版本的.Net Framework,就必须先删除1.0的。听说刚发行的.Net Framework1.1已经对1.0做了很多改进,甚至基础类库的层次也有所变动。看来在旧版本的.Net Framework开发的程序将来往新版本上面迁移的时候少不了修改程序代码。 JRE的基础类库 JRE自带的基础类库主要是JRE/lib/rt.jar这个文件,包括了Java2平台标准版的所有类库。和JRE的版本一致。 .Net Framekwork的核心类库 .Net Framekwork的核心类库被放置在C:/Winnt/assembly/gac/目录下,按照不同的名称空间放在不同目录中,不像JRE打成了一个包。并且可以同时存在不同的版本,例如: 某类库1.0版本 C:/Winnt/assembly/gac/名称/1.0/名称.dll 某类库1.1版本 C:/Winnt/assembly/gac/名称/1.1/名称.dll 这样做,虽然很灵活,可以随时把类库更新到最新的状态,但是很容易带来版本管理的复杂度,造成版本不一致。 JRE类库的查找方法和版本管理 JRE中由ClassLoader负责查找和加载程序引用到的类库,基础类库ClassLoader会到rt.jar中自动加载,其它的类库,ClassLoader在环境变量CLASSPATH指定的路径中搜索,按照先来先到的原则,放在CLASSPATH前面的类库先被搜到,Java程序启动之前建议先把PATH和CLASSPATH环境变量设好,OS通过PATH来找JRE,确定基础类库rt.jar的位置,JRE的ClassLoader通过CLASSPATH找其它类库。但有时候会出现这样的情况,希望替换基础类库中的类库,那么也可以简单的通过-Djava.endrosed.path=...参数传递给java.exe,于是ClassLoader会先于基础类库使用java.endrosed.path参数指定路径的类库。因此Java的版本管理是非常简单有效的,也许很原始,不过很好用,简单就不容易出错。(所以我很奇怪Eric Ramond为什么批评Java的类库管理机制,他还居然批评Java的接口,令人怀疑他对Java的了解程度) .Net Framework的类库管理机制 .Net Framework的类库管理机制相当强大和复杂,分为私有类库和共享类库。 私有类库就放在exe程序当前路径下,或其相对路径中,只有当前程序可见。 共享类库需要在GAC(Global Assembly Cache)中注册,注册过程比较复杂,首先要用工具生成公开/私有密钥对,然后结合密钥和类库版本号连编,最后使用工具注册到GAC中好以后,会被放在"C:/Winnt/assembly/gac/类库的名称空间/版本号/"目录下,不同的类库版本在注册的时候会按照版本号分开放置: 某类库1.0版本 C:/Winnt/assembly/gac/名称/1.0/名称.dll 某类库1.1版本 C:/Winnt/assembly/gac/名称/1.1/名称.dll 也就是可以同时存在一个类库的n个版本,至于在程序中用哪个版本,在程序的配置文件中声明,CLR会根据声明来调用相应的版本的类库。我觉得.Net实现方法未免太复杂了一些,将所有共享类库都塞到一个系统目录下,并且同一个类库还有n个版本,将来.Net第三方开发的类库逐渐丰富起来以后,.Net类库的GAC也会越来越庞大,会不会也搞得和Windows注册表一样难以维护?软件发布到服务器上的时候,类库要再注册一次,服务器会逐渐形成一个庞大的树状的GAC,GAC里面存放着组件的n个版本。试想经过一段时间之后,C:/Winnt/assembly/gac/目录会越来越庞大,有的组件甚至有n个版本都放在那里,你又不敢随便删除,不知道是不是有程序需要使用,我不明白MS为什么要把这么简单的事情搞到这么复杂? 综上所述,Java的版本管理方式简单而有效,C#的版本管理方式功能强大,不过是不是太复杂了?会不会搞成第二个注册表一样的东西? 二、虚拟机启动和加载类库的方式 Java的虚拟机启动和加载类库 在Console执行java.exe xxx命令以后,如前所述的寻找JRE,OS找到JRE目录,根据java.exe的传递参数,选择加载Server版的jvm.dll还是Client版的jvm.dll,然后加载jvm.dll,把控制权交给jvm.dll。 接下来,jvm.dll进行初始化,分配内存等等动作,然后在CLASSPATH路径中寻找class,找到class以后,寻找class中的程序入口点Main函数,然后从Main函数执行程序,在执行过程中,使用ClassLoader动态加载一系列引用到的类。当调用到native方法时,jvm.dll告诉OS在JRE/bin目录下寻找某某DLL文件,调入内存,于是实现了JNI调用。 .Net的虚拟机的启动推测 我对.Net的虚拟机的启动过程还一知半解,自己写了一些例程,并且用内存工具来检测观察,推测.Net的运行机制,先来抛砖引玉,请熟悉Windows平台编程的朋友指教。.Net有3个目录中的文件在执行的时候会被加载 1、C:/WINNT/Microsoft.NET/Framework/v版本号/ 该目录下的mscorlib.dll,mscorrsn.dll,mscorwsk.dll,mscorjit.dll是核心DLL,大概是运行虚拟机的必要文件,其中mscrolib.dll是入口点。此外,该目录下还有一些.Net的System名称空间的IL类库,与C:/Winnt/assembly/gac/相应目录下的IL类库完全一样,这些是最核心的基础类库。.Net的编译器,检查器等等工具软件也在该目录,推测System名称空间的核心类库之所以在这个目录下copy一份是因为作为.Net的编译器等工具的私有类库之用。 2、C:/Winnt/assembly/gac/ 该目录下放置.Net共享类库,如前所述 3、C:/Winnt/assembly/nativeimages_.Net版本号/ 在该目录下也有一些以System名称空间开头的核心类库,推测是MS为了加快CLR的执行效率把核心类库进行本地化,编译为native image的同名DLL。可以观察到该目录下的同名DLL文件,比GAC目录下的同名DLL文件体积大,可能是因为link底层DLL库的缘故。 某核心类库 C:/Winnt/assembly/nativeimages_.Net版本号/名称空间/.Net版本号_散列码/名称.dll 另外值得注意的地方是有两个mscorlib.dll 1、C:/WINNT/Microsoft.NET/Framework/v版本号/mscrolib.dll (1.88MB) 2、C:/WINNT/assembly/NativeImages1_v版本号/mscorlib/版本号__散列码/mscrolib.dll (3.07MB) mscrolib.dll (1.88MB)还是一个IL码的版本,所以映射了一个native的版本的mscrolib.dll (3.07MB),来加快CLR的速度。 当IL的exe程序被双击执行时,OS Loader读入程序,识别出是IL,根据IL内部的引用定义,加载mscorlib.dll,而mscorlib.dll也是IL,内部引用C:/winnt/system32/mscoree.dll,于是再加载mscoree.dll,然后把控制权交给mscoree.dll,mscoree.dll接着加载mscrorsn.dll,mscrowsk.dll,mscrojit.dll,为了加快mscorlib.dll的调用,加载mscorlib.dll的native image版本,然后由mscorlib.dll接管控制权(不知道这两个mscorlib.dll是如何来上管IL,下连native code的?)最后寻找IL码程序的入口点Main函数,开始执行程序,在执行过程中,使用Class Loader动态加载一系列引用到的类,在当前路径下,在共享类库的GAC中查找等等。 这里和jvm.dll不同的一点是,jvm.dll加载的基础类库和加载其它类库方式完全一样,全部都是字节码的class。而mscrolib.dll加载以System名称开头的核心类库的时候,使用了“不正当竞争手法”。mscrolib.dll从GAC中加载共享核心类库之后,又C:/Winnt/assembly/nativeimages_.Net版本号/名称空间/ 目录下加载了核心类库的native版本,这样一来,自然CLR运行起来要快多了。特别是图形图像类库全部都有native映射版本,所以CLR上运行GUI焉能不快? 对比CLR和JRE的加载过程,比较不同的地方是mscorlib.dll和System核心类库都有一个native image,可能这是CLR运行速度比较快的一个主要原因吧。 分析完以后有一个特别明显的感受,Java的底层运行机制设计的特别简单,而.Net的底层运行机制设计的特别复杂。但是在企业层刚好相反,J2EE设计的特别复杂,而.Net却设计的特别简单,真是有意思! Java的底层机制设计虽然简单,但是很健壮,.Net设计使得它的CLR速度快,类库管理功能强大,但是不是比Java更优秀,还要等以后慢慢看了。 注: 我查了一下《.Net Essential》这本书,上面提到这样的说法。 MS更新了Windows各个版本的OS Loader程序,使得OS Loader可以识别.Net PE格式的exe文件,当执行Windows Native PE格式的exe文件的时候,OS Loader按照以往的方式加载系统DLL。如果是.Net PE格式的exe文件,OS Loader加载mscorlib.dll,然后把控制权交给mscorlib.dll。
TK抓包协议分析:So层逆向 第三个参数是一个回调函数,这里他的返回值1表示成功,0表示失败,那我们手动把他Hook为0,让他不支持quic协议,实现降级。等,我们是为了解决抓包问题,那很有可能是在net目录下(network),那来搜索一下。开了抓包以后APP直接是网络无连接了,并且抓到的请求也是不正常的,下面我们就开始定位。看了半天感觉也没啥有用的东西,那下面我们整理一下已经有信息,来猜测一下,后续怎么进行。那可以猜测,我们真正需要Hook的那个函数也有可能是这样加载的,可以字符串搜索一下。 阅读详情

相关推荐

CODESYS V3.5 SP17编程环境全攻略:从安装到多语言编程实战

本文全面解析CODESYS V3.5 SP17编程环境,从安装配置到多语言编程实战技巧。详细介绍了运行时环境设置、六种IEC 61131-3语言的特性对比与混合编程策略,以及高级功能开发如自定义算法模块和实时通信配置。适合工业自动化工程师快速掌握这一强大工具。

weixin_30632089的博客 492

.NET学习笔记 -- 那堆名词到底是啥(CLR、CLI、CTS、CLS、IL、JIT)

什么是CLR? CLR,公共语言运行时(Common Language Runtime)是一个由多种语言使用的“运行时”。他的核心功能包括(内存管理、程序集加载、安全性、异常处理和线程同步),可以被面向CLR的所有语言使用。这里的“运行时”,就是一个运行时环境,就像JAVA虚拟机一样。哦,错了,确切的说是JRE(Java Runtime Enviromental)。JVM确切的说不是一个实体的...

weixin_30641465的博客 222

系统安装、qt配置、安装pcie驱动

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 安装Linux系统指定:ununtu20.04并配置相关软件环境 前言 提示:这里可以添加本文要记录的大概内容: ununtu20.04、Qt 5.9.0、pcie驱动 提示:以下是本篇文章正文内容,下面案例可供参考 一、安装系统 制作系统盘(win10),在开机时按相应键进入BIOS,(华硕需要先改配置启动->CSM->开启->第一个选项选第一个或第二个),等待即可 进入后按照https://www.sysgeek.

weixin_44832804的博客 2206

编译器 脚本解释器 JRE和CLR的一些粗浅认识。

编译器:直接生成exe 脚本解释器:比如ruby,python,javascript,代码是逐行执行的 JRE/CLR:java runtime environment / common language runtime,这些东西在本质上和脚本解释器没有太大的区别,但是中间有一个编译的过程,但是并不是编译为本机代码,而是编译为它们的运行环境所能执行的bytecode。 对微软现在的.ne...

weixin_30371469的博客 152

STM32F103+W5500网络通信

STM32F103+W5500网络通信一、W5500模块(一)W5500以太网模块介绍(二)模块排针功能表二、 modbus协议(一)modbus协议原理(二)Modbus 通讯方式1.Modbus三种通讯方式2.在Modbus网络上传输3.以太网(modbus tcp/ip)三、参考资料 一、W5500模块 (一)W5500以太网模块介绍 D-W5500 EVB以太网模块是一款基于WIZnet W5500芯片的以太网模块,且性价比高的以太网模块。W5500是一款全硬件TCP/IP嵌入式以太网控制器,为

”一只特立独行的猪“的博客 1万+

Veristand自动化测试:Stimulus Profile Editor实战指南

本文是Veristand自动化测试中Stimulus Profile Editor的实战指南。详细介绍了如何利用这一图形化工具,将繁琐的手动测试流程转化为一键自动执行的“剧本”,涵盖工程控制、信号编程、预制动作调用等核心功能,并通过手把手案例演示了构建首个自动化测试脚本的全过程,帮助测试工程师显著提升效率与可靠性。

dd012的博客 495

clr与java虚拟机区别_CLR与JVM

原标题:CLR与JVM首先要纠正垃圾回收在于JVM和.NET的CLR的平台功能而不是语言本身。存在一些历史差异主要是因为.Net的设计是从java(和其他基于gc的平台)演变中吸取教训改良后的结果。CLR一开始就设计成了分代垃圾回收,但是初始JVM没有分代垃圾收集器。第一代的JVM垃圾收集器往往是Mark和Sweep这样简单。但随着发展,JVM已引用了分代垃圾回收机制JVM提供了大量选项来调整GC...

weixin_30988079的博客 1560

Manimgl 进阶笔记

目录 一、调整视频输出的纵横比 二、调整预览窗口的尺寸 三、在开发工具中直接调试 一、调整视频输出的纵横比 调整输出视频的纵横比,在日常开发中属于比较基本的需求。要使用 Manimgl 得到期望的分辨率的视频输出需要修改以下几个地方: 第一步:在 custom_config.yml 配置文件中通过 camera_qualities设置视频的输出分辨率。manimlib 框架已经在 default_config.yml 文件中设置了四种视频输出分辨率,default_qualities 参数.

gunnery的专栏 2860

C#.Net学习笔记——CLR核心机制

的运行环境。

weixin_46711336的博客 3805

【01、Go与VSCode的安装】

小白学Go语言

wangruil的博客 1537

基于龙虾Claw的会议纪要自动提取与重点内容总结办公场景实践

本文介绍如何使用龙虾Claw构建会议纪要自动提取与重点内容总结系统,实现会议内容的智能处理。

一键难忘的博客 255

CLR和JRE的运行机制初步总结

概念比较: Java C# byte code IL(字节码,中间语言) jvm.dll mscrolib.dll,mscrojit.dll(虚拟机) JRE CLR(运行环境) JDK .Net Framework(开发框架) package assembly(类库,程序集)一、关于类库的版本管理问题 Java和C#代码运行要依靠其运行环境(JRE,CLR)和运行环境带 的基础类库(C#称为配件

iseeiconquer的专栏 1086

时间序列预测 | Python实现ARIMAX和VARMAX时间序列数据预测

时间序列预测 | Python实现ARIMAX和VARMAX时间序列数据预测 目录时间序列预测 | Python实现ARIMAX和VARMAX时间序列数据预测基本介绍ARIMAXVARVARMAVARMAXSESHWES参考资料 基本介绍 本文介绍ARIMAX、VAR、VARMA和VARMAX基本概念及其Python程序设计。 ARIMAX 具有外源回归量的自回归整合移动平均值(ARIMAX)是 ARIMA 模型的扩展,其还包括外生变量的建模。 外生变量也称为协变量,可以被认为是并行输入序列,其在与

前程算法屋的博客 6689

【JDK、JRE与JVM:解密Java运行机制】

摘要:本文详细解析了JDK、JRE和JVM三者的关系与运行机制。JDK包含开发工具和内置JRE,JRE由JVM和运行类库组成。重点揭示了Java的"双JRE"设计:JDK内置私有JRE用于开发工具运行,公共JRE用于执行用户程序。通过分析javac命令的执行流程,说明其本质是通过包装器调用tools.jar中的编译类。这种设计实现了开发环境与运行环境的隔离,确保开发工具稳定性,同时简化开发者操作。文章还解答了删除内置JRE的影响及JDK9后模块化的变化,指出核心设计思想始终未变。

TheMyth142857的博客 1962

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

jre7和java区别_java-JRE和JVM有什么区别?

java-JRE和JVM有什么区别?这个问题已经在这里有了答案:JVM,JDK,JRE和OpenJDK有什么区别? 18个答案我认为JVM与.NET Framework类似,对吗? 那么,JRE是什么? JRE和JVM有什么区别?Raedwald asked 2020-02-20T03:08:20Z12个解决方案99 vote...

weixin_39852121的博客 383

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

jdk,jre,jvm的关系图

bin:最主要的是编译器(javac.exe); db:jdk从1.6之后内置了Derby数据库,它是是一个纯用Java实现的内存数据库,属于Apache的一个开源项目。用Java实现的,所以可以在任何平台上运行;另外一个特点是体积小,免安装,只需要几个小jar包就可以运行了。 include:java和JVM交互用的头文件; lib:常用类库 jre:java运行环境 初学JAVA很容易被其中的很多概念弄的傻傻分不清楚,首先从概念上理解一下吧,JDK(Java Development Kit)简单理解就.

haodeming的博客 617

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

让Java程序自带JRE运行

用Java开发程序,发布时总要考虑的问题就是怎么在使用者的机器上装好JRE。要考虑的问题很多:使用者有没有能力独自安装JRE,使用者已有的JRE和我们需要的版本是不是一致,会不会出现版本问题,等等。使用.NET要考虑的问题就少些。现在.NET CLR似乎已经很普及了,看好多D版的

8911

Java中JDK,JRE和JVM之间的关系

初学JAVA很容易被其中的很多概念弄的傻傻分不清楚,首先从概念上理解一下吧,JDK(Java Development Kit)简单理解就是Java开发工具包,JRE(Java Runtime Enviroment)是Java的运行环境,JVM( java virtual machine)也就是常常听到Java虚拟机。JDK是面向开发者的,JRE是面向使用JAVA程序的用户,上面只是简单的区别,一般网上好多都讲概念,我就不讲了,直接截图应该会更清晰一点,我安装的JDK1.8,效果如图: java学习交流:7

weixin_51393513的博客 271

让Java程序自带JRE

用Java开发程序,发布时总要考虑的问题就是怎么在使用者的机器上装好JRE。要考虑的问题很多:使用者有没有能力独自安装JRE,使用者已有的JRE和我们需要的版本是不是一致,会不会出现版本问题,等等。使用.NET要考虑的问题就少些。现在.NET CLR似乎已经很普及了,看好多D版的WinXP都会自己安装最新的.NETCLR,而且似乎它的安装界面也比JRE友好些。彻底解决安装JRE的问题的

SUB 的专栏 2766
上一篇: Junit 中的设计模式
下一篇: Jetspeed的中文化
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值