亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

CLR和JRE的運行機制的初步總結

2019-11-17 06:25:24
字體:
來源:轉載
供稿:網友

  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#稱為配件或者程序集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_MACHINESOFTWAREJavaSoftJava Runtime Environment 查看CurrentVersion的鍵值指向哪個JRE
最常用的是在PATH路徑中找JRE,一般情況下,自己的程序運行之前都會先在批處理文件里面臨時設置PATH,把自己用的JRE放到PATH路徑最前面,所以肯定會運行自己帶的JRE,不會造成版本混亂。

.Net Framework的版本治理

.Net Framework被固定安裝在C:WinntMicrosoft.NETFrameworkv版本號目錄下,并且在同一臺機器只能安裝一套,要安裝1.1版本的.Net Framework,就必須先刪除1.0的。聽說剛發行的.Net Framework1.1已經對1.0做了很多改進,甚至基礎類庫的層次也有所變動??磥碓谂f版本的.Net Framework開發的程序將來往新版本上面遷移的時候少不了修改程序代碼。

JRE的基礎類庫

JRE自帶的基礎類庫主要是JRElibt.jar這個文件,包括了Java2平臺標準版的所有類庫。和JRE的版本一致。

.Net Framekwork的核心類庫

.Net Framekwork的核心類庫被放置在C:Winntassemblygac目錄下,按照不同的名稱空間放在不同目錄中,不像JRE打成了一個包。并且可以同時存在不同的版本,例如:
某類庫1.0版本 C:Winntassemblygac名稱1.0名稱.dll
某類庫1.1版本 C:Winntassemblygac名稱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:Winntassemblygac類庫的名稱空間版本號"目錄下,不同的類庫版本在注冊的時候會按照版本號分開放置:
某類庫1.0版本 C:Winntassemblygac名稱1.0名稱.dll
某類庫1.1版本 C:Winntassemblygac名稱1.1名稱.dll

也就是可以同時存在一個類庫的n個版本,至于在程序中用哪個版本,在程序的配置文件中聲明,CLR會根據聲明來調用相應的版本的類庫。我覺得.Net實現方法未免太復雜了一些,將所有共享類庫都塞到一個系統目錄下,并且同一個類庫還有n個版本,將來.Net第三方開發的類庫逐漸豐富起來以后,.Net類庫的GAC也會越來越龐大,會不會也搞得和Windows注冊表一樣難以維護?軟件發布到服務器上的時候,類庫要再注冊一次,服務器會逐漸形成一個龐大的樹狀的GAC,GAC里面存放著組件的n個版本。試想經過一段時間之后,C:Winntassemblygac目錄會越來越龐大,有的組件甚至有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在JREin目錄下尋找某某DLL文件,調入內存,于是實現了JNI調用。

.Net的虛擬機的啟動推測

我對.Net的虛擬機的啟動過程還一知半解,自己寫了一些例程,并且用內存工具來檢測觀察,推測.Net的運行機制,先來拋磚引玉,請熟悉Windows平臺編程的朋友指教。.Net有3個目錄中的文件在執行的時候會被加載

1、C:WINNTMicrosoft.NETFrameworkv版本號
該目錄下的mscorlib.dll,mscorrsn.dll,mscorwsk.dll,mscorjit.dll是核心DLL,大概是運行虛擬機的必要文件,其中mscrolib.dll是入口點。此外,該目錄下還有一些.Net的System名稱空間的IL類庫,與C:Winntassemblygac相應目錄下的IL類庫完全一樣,這些是最核心的基礎類庫。.Net的編譯器,檢查器等等工具軟件也在該目錄,推測System名稱空間的核心類庫之所以在這個目錄下copy一份是因為作為.Net的編譯器等工具的私有類庫之用。

2、C:Winntassemblygac
該目錄下放置.Net共享類庫,如前所述

3、C:Winntassemblyativeimages_.Net版本號
在該目錄下也有一些以System名稱空間開頭的核心類庫,推測是MS為了加快CLR的執行效率把核心類庫進行本地化,編譯為native image的同名DLL。可以觀察到該目錄下的同名DLL文件,比GAC目錄下的同名DLL文件體積大,可能是因為link底層DLL庫的緣故。
某核心類庫 C:Winntassemblyativeimages_.Net版本號名稱空間.Net版本號_散列碼名稱.dll

另外值得注重的地方是有兩個mscorlib.dll
1、C:WINNTMicrosoft.NETFrameworkv版本號mscrolib.dll (1.88MB)
2、C:WINNTassemblyNativeImages1_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:winntsystem32mscoree.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:Winntassemblyativeimages_.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。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本精品久久中文字幕佐佐木| 91国产精品视频在线| 26uuu日韩精品一区二区| 在线精品视频视频中文字幕| 欧美视频免费在线观看| 俺去啦;欧美日韩| 久久精品中文字幕一区| 国产一区私人高清影院| 亚洲无亚洲人成网站77777| 日韩精品极品在线观看播放免费视频| 91av在线播放| 668精品在线视频| 欧美国产精品人人做人人爱| 欧美老少配视频| 九色精品美女在线| 成人精品在线观看| 亚洲丝袜在线视频| 欧美精品激情在线| 77777亚洲午夜久久多人| 在线播放亚洲激情| 国产伦精品一区二区三区精品视频| 日韩精品视频三区| 久久国产精品久久久久久| 亚洲午夜女主播在线直播| 国产香蕉精品视频一区二区三区| 久久综合88中文色鬼| 精品自在线视频| 日韩经典中文字幕| 亚洲美女动态图120秒| 亚洲综合小说区| 欧美日韩另类字幕中文| 亚洲第一黄色网| 国产精品一区二区三区免费视频| 亚洲午夜未删减在线观看| 亚洲国产精品热久久| 777午夜精品福利在线观看| 久久久国产精品亚洲一区| 亚洲成人av片| 久久久国产精品视频| 亚洲国产高清福利视频| 久久久久久久97| 亚洲精品久久久一区二区三区| 欧美中文字幕在线观看| 夜夜狂射影院欧美极品| www国产精品视频| 国产亚洲精品久久久久动| 亚洲欧美日韩天堂| 亚洲剧情一区二区| 欧美色播在线播放| 亚洲欧美自拍一区| 欧美伦理91i| 亚洲最大福利视频网站| 国产视频久久久久| 欧美日韩精品二区| 亚洲欧美一区二区三区情侣bbw| 国产精品人成电影在线观看| 欧美日韩在线视频一区| **欧美日韩vr在线| 国产精品都在这里| 午夜精品一区二区三区av| 亚洲美女动态图120秒| 久久99国产综合精品女同| 国产国语videosex另类| 欧美大片免费观看在线观看网站推荐| 欧美福利在线观看| 91久久久久久| 日韩av在线不卡| 国产精品爽爽ⅴa在线观看| 最近中文字幕mv在线一区二区三区四区| 国产精品久久一区主播| 成人h片在线播放免费网站| 中日韩美女免费视频网站在线观看| 欧美中文字幕精品| 在线中文字幕日韩| 国产精品久久久久久久久免费看| 91在线免费网站| 色yeye香蕉凹凸一区二区av| 久久亚洲私人国产精品va| 91亚洲精品久久久久久久久久久久| 亚洲已满18点击进入在线看片| 秋霞成人午夜鲁丝一区二区三区| 日韩三级影视基地| 亚洲欧美一区二区三区久久| 亚洲乱码一区二区| 九九久久精品一区| 久久在线免费视频| 中文字幕不卡在线视频极品| 55夜色66夜色国产精品视频| 亚洲人精选亚洲人成在线| 欧美又大粗又爽又黄大片视频| 国产成人在线一区| 91成品人片a无限观看| 国产中文字幕日韩| 国产精品久久97| 国产欧美精品久久久| 国产亚洲美女久久| 日韩小视频网址| 国产精品视频白浆免费视频| 欧美性极品xxxx娇小| 国产精品最新在线观看| 成人网在线视频| 成人精品网站在线观看| 欧美激情一区二区久久久| 欧美日韩国产精品专区| 538国产精品视频一区二区| 欧美一区二区大胆人体摄影专业网站| 亚洲成色999久久网站| 亚洲va欧美va国产综合剧情| 亚洲日韩中文字幕在线播放| 91沈先生作品| 国产成人综合精品在线| 亚洲国产日韩欧美在线图片| 精品无人区太爽高潮在线播放| 成人黄色免费看| 久久久久国产精品一区| 国产91成人video| 国产精品视频区1| 久久国产精品影视| 亚洲欧美国产一本综合首页| 一区二区在线视频| 久久成人综合视频| 成人乱人伦精品视频在线观看| 欧美高清第一页| 色婷婷久久一区二区| 国产欧美日韩中文| 国产欧美日韩中文字幕在线| 欧美在线观看www| 日韩在线观看高清| 日韩欧美一区二区三区| 国产日韩精品综合网站| 国产精品www色诱视频| 精品亚洲国产视频| 国产精品盗摄久久久| 精品亚洲男同gayvideo网站| 亚洲精品视频久久| 永久免费精品影视网站| 欧美另类第一页| 日韩精品极品在线观看播放免费视频| 中文字幕国产亚洲| 精品国产福利在线| 国产日韩欧美在线视频观看| 亚洲欧洲在线视频| 国内免费精品永久在线视频| 成人黄色激情网| 国产精品日韩在线| 亚洲人成绝费网站色www| 日韩视频免费中文字幕| 亚洲欧美日韩一区二区三区在线| 欧美在线视频观看免费网站| 国产成人高清激情视频在线观看| 精品人伦一区二区三区蜜桃网站| 欧美电影免费观看| 日韩视频免费大全中文字幕| 欧美色道久久88综合亚洲精品| 欧美日韩亚洲国产一区| 亚洲精品一区二区三区不| 欧美激情精品久久久久久久变态| 欧美夫妻性生活xx| 精品亚洲男同gayvideo网站| 在线观看国产精品淫| 中文字幕欧美精品在线| 丝袜美腿亚洲一区二区| 成人福利网站在线观看11| 亚洲欧美激情另类校园|