日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

java源代碼分析----jvm.dll裝載過程

瀏覽:192日期:2024-06-07 09:42:44
內容: 簡述眾所周知java.exe是java class文件的執行程序,但實際上java.exe程序只是一個執行的外殼,它會裝載jvm.dll(windows下,以下皆以windows平臺為例,linux下和solaris下其實類似,為:libjvm.so),這個動態連接庫才是java虛擬機的實際操作處理所在。本文探究java.exe程序是如何查找和裝載jvm.dll動態庫,并調用它進行class文件執行處理的。源代碼本文分析之代碼,《JavaTM 2 SDK, Standard Edition, v1.4.2 fcsCommunity Source Release》,可從sun官方網站下載,主要分析的源代碼為:j2sesrcsharebinjava.cj2sesrcwindowsbinjava_md.cjava.c是什么東西‘java程序’源代碼所謂‘java程序’,包括jdk中的java.exejavac.exejavadoc.exe,java.c源代碼中通過JAVA_ARGS宏來控制生成的代碼,如果該宏沒定義則編譯文件控制生成java.exe否則編譯文件控制生成其他的‘java程序’。比如:j2semakejavajavacMakefile(這是javac編譯文件)中:$(CD) ../../sun/javac ; $(MAKE) $@ RELEASE=$(RELEASE) FULL_VERSION=$(FULL_VERSION)j2semakesunjavacjavacMakefile(由上面Makefile文件調用)中:JAVA_ARGS = '{ '-J-ms8m', 'com.sun.tools.javac.Main' }'則由同一份java.c代碼生成的javac.exe程序就會直接調用java類方法:com.sun.tools.javac.Main,這樣使其執行起來就像是直接運行的一個exe文件,而未定義JAVA_ARGS的java.exe程序則會調用傳遞過來參數中的類方法。從java.c的main入口函數說起main()函數中前面一段為重新分配參數指針的處理。然后調用函數:CreateExecutionEnvironment,該函數主要查找java運行環境的目錄,和jvm.dll這個虛擬機核心動態連接庫文件路徑所在。根據操作系統不同,該函數有不同實現版本,但大體處理邏輯相同,我們看看windows平臺該函數的處理(j2sesrcwindowsbinjava_md.c)。CreateExecutionEnvironment函數主要分為三步處理:a、查找jre路徑。b、裝載jvm.cfg中指定的虛擬機動態連接庫(jvm.dll)參數。c、取jvm.dll文件路徑。實現:a、查找jre路徑是通過java_md.c中函數:GetJREPath實現的。該函數首先調用GetApplicationHome函數,GetApplicationHome函數調用windowsAPI函數GetModuleFileName取java.exe程序的絕對路徑,以我的jdk安裝路徑為例,為:“D:javaj2sdk1.4.2_04binjava.exe,然后去掉文件名取絕對路徑為:“D:javaj2sdk1.4.2_04bin,之后會在去掉最后一級目錄,現在絕對路徑為:“D:javaj2sdk1.4.2_04。然后GetJREPath函數繼續判斷剛剛取的路徑+binjava.dll組合成的這個java.dll文件是否存在,如果存在則“D:javaj2sdk1.4.2_04為JRE路徑,否則判斷取得的“D:javaj2sdk1.4.2_04路徑+jrebinjava.dll文件是否存在,存在則“D:javaj2sdk1.4.2_04jre為JRE路徑。如果上面兩種情況都不存在,則從注冊表中去查找(參見函數GetPublicJREHome)。函數:GetPublicJREHome先查找HKEY_LOCAL_MACHINESoftwareJavaSoftJava Runtime EnvironmentCurrentVersion鍵值“當前JRE版本號,判斷“當前JRE版本號是否為1.4做為版本號,如果是則取HKEY_LOCAL_MACHINESoftwareJavaSoftJava Runtime Environment“當前JRE版本號JavaHome的路徑所在為JRE路徑。我的JDK返回的JRE路徑為:“D:javaj2sdk1.4.2_04jre。b、裝載jvm.cfg虛擬機動態連接庫配置文件是通過java.c中函數:ReadKnownVMs實現的。該函數首先組合jvm.cfg文件的絕對路徑,JRE路徑+lib+ARCH(CPU構架)+jvm.cfgARCH(CPU構架)的判斷是通過java_md.c中GetArch函數判斷的,該函數中windows平臺只有兩種情況:WIN64的‘ia64’,其他情況都為‘i386’。我的為i386所以jvm.cfg文件絕對路徑為:“D:javaj2sdk1.4.2_04jrelibi386jvm.cfg。文件內容如下:## @(#)jvm.cfg 1.7 03/01/23# # Copyright 2003 Sun Microsystems, Inc. All rights reserved.# SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.# # ### List of JVMs that can be used as an option to java, javac, etc.# Order is important -- first in this list is the default JVM.# NOTE that this both this file and its format are UNSUPPORTED and# WILL GO AWAY in a future release.## You may also select a JVM in an arbitrary location with the# '-XXaltjvm=' option, but that too is unsupported# and may not be available in a future release.#-client KNOWN-server KNOWN-hotspot ALIASED_TO -client-classic WARN-native ERROR-green ERROR(如果細心的話,我們會發現在JDK目錄中我的為:“D:javaj2sdk1.4.2_04jrebinclient和“D:javaj2sdk1.4.2_04jrebinserver兩個目錄下都存在jvm.dll文件。而java正是通過jvm.cfg配置文件來管理這些不同版本的jvm.dll的。)ReadKnownVMs函數會將該文件中的配置內容讀入到一個JVM配置結構的全局變量中,該函數首先跳過注釋(以‘#’開始的行),然后讀取以‘-’開始的行指定的jvm參數,每一行為一個jvm信息,第一部分為jvm虛擬機名稱,第二部分為配置參數,比如行:“-client KNOWN則“-client為虛擬機名稱,而“KNOWN為配置類型參數,“KNOWN表示該虛擬機的jvm.dll存在,而“ALIASED_TO表示為另一個jvm.dll的別名,“WARN表示該虛擬機的jvm.dll不存在但運行時會用其他存在的jvm.dll替代執行,而“ERROR同樣表示該類虛擬機的jvm.dll不存在且運行時不會找存在的jvm.dll替代而直接拋出錯誤信息。在運行java程序時指定使用那個虛擬機的判斷是由java.c中函數:CheckJvmType判斷,該函數會檢查java運行參數中是否有指定jvm的參數,然后從ReadKnownVMs函數讀取的jvm.cfg數據結構中去查找,從而指定不同的jvm類型(最終導致裝載不同jvm.dll)。有兩種方法可以指定jvm類型,一種按照jvm.cfg文件中的jvm名稱指定,第二種方法是直接指定,它們執行的方法分別是“java -J、“java -XXaltjvm=或“java -J-XXaltjvm=。如果是第一種參數傳遞方式,CheckJvmType函數會取參數‘-J’后面的jvm名稱,然后從已知的jvm配置參數中查找如果找到同名的則去掉該jvm名稱前的‘-’直接返回該值;而第二種方法,會直接返回“-XXaltjvm=或“-J-XXaltjvm=后面的jvm類型名稱;如果在運行java時未指定上面兩種方法中的任一一種參數,CheckJvmType會取配置文件中第一個配置中的jvm名稱,去掉名稱前面的‘-’返回該值。CheckJvmType函數的這個返回值會在下面的函數中匯同jre路徑組合成jvm.dll的絕對路徑。比如:如果在運行java程序時使用“java -J-client test則ReadKnownVMs會讀取參數“-client然后查找jvm.cfg讀入的參數中是否有jvm名稱為“-client的,如果有則去掉jvm名稱前的“-直接返回“client;而如果在運行java程序時使用如下參數:“java -XXaltjvm=D:javaj2sdk1.4.2_04jrebinclient test,則ReadKnownVMs會直接返回“D:javaj2sdk1.4.2_04jrebinclient;如果不帶上面參數執行如:“java test,因為在jvm.cfg配置文件中第一個存在的jvm為“-client,所以函數ReadKnownVMs也會去掉jvm名稱前的“-返回“client。其實這三中情況都是使用的“D:javaj2sdk1.4.2_04jrebinclientjvm.dll這個jvm動態連接庫處理test這個class的,見下面GetJVMPath函數。c、取jvm.dll文件路徑是通過java_md.c中函數:GetJVMPath實現的。由上面兩步我們已經獲得了JRE路徑和jvm的類型字符串。GetJVMPath函數判斷CheckJvmType返回的jvm類型字符串中是否包含了‘’或‘/’如果包含則以該jvm類型字符串+jvm.dll作為JVM的全路徑,否則以JRE路徑+bin+jvm類型字符串+jvm.dll作為JVM的全路徑??纯瓷厦娴睦樱谝环N情況“java -J-client testjvm.dll路徑為:JRE路徑+bin+jvm類型字符串+jvm.dll 按照我的JDK路徑則為:“D:javaj2sdk1.4.2_04jre+“bin+“client+“jvm.dll。第二種情況“java -XXaltjvm=D:javaj2sdk1.4.2_04jrebinclient test路徑為:jvm類型字符串+jvm.dll即為:“D:javaj2sdk1.4.2_04jrebinclient+“jvm.dll第三種情況“java test為:“D:javaj2sdk1.4.2_04jre+“bin+“client+“jvm.dll與情況一相同。所以這三種情況都是調用的jvm動態連接庫“D:javaj2sdk1.4.2_04jrebinclientjvm.dll處理test類的。我們來進一步驗證一下:打開cmd控制臺:設置java裝載調試E:workjava_research>set _JAVA_LAUNCHER_DEBUG=1情況一E:workjava_research>java -J-client test.ScanDirectory----_JAVA_LAUNCHER_DEBUG----JRE path is D:javaj2sdk1.4.2_04jrejvm.cfg[0] = ->-client-server-hotspot-classic-native-greenjava test.ScanDirectory----_JAVA_LAUNCHER_DEBUG----JRE path is D:javaj2sdk1.4.2_04jrejvm.cfg[0] = ->-client-server-hotspot-classic-native-greenjava -XXaltjvm=D:javaj2sdk1.4.2_04jrebinserver test.ScanDirectory----_JAVA_LAUNCHER_DEBUG----JRE path is D:javaj2sdk1.4.2_04jrejvm.cfg[0] = ->-client-server-hotspot-classic-native-green
標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
99久久精品网| 免费视频亚洲| 蜜桃久久av一区| 久久中文字幕二区| 免费视频国产一区| 午夜久久久久| 99亚洲视频| 爽好久久久欧美精品| 国产亚洲毛片| 在线成人动漫av| 91精品国产调教在线观看| 欧美精品97| 精品国产黄a∨片高清在线| a国产在线视频| 亚洲精品小说| 亚洲不卡视频| 欧美1区2区3| 欧美精选视频一区二区| 午夜久久一区| 亚洲va久久| 福利一区和二区| 亚洲激情久久| 国产三级一区| 丝袜美腿诱惑一区二区三区| 91看片一区| 免费看精品久久片| 嫩草伊人久久精品少妇av杨幂 | 日韩高清不卡在线| 国产精品久久观看| 免费中文字幕日韩欧美| 国产精品第一国产精品| 亚洲精品一区三区三区在线观看| 欧美资源在线| 亚洲视频国产精品| 国产视频一区在线观看一区免费| 91成人福利| av资源亚洲| 美女精品视频在线| 好吊日精品视频 | 亚洲性色视频| 国产福利资源一区| 丝袜美腿亚洲一区二区图片| 欧美国产偷国产精品三区| 日韩动漫一区| 免播放器亚洲一区| 午夜精品亚洲| 久久伦理在线| 黄色在线观看www| 久久中文字幕一区二区三区| 午夜日韩av| 国产精品av一区二区| 精品成av人一区二区三区| 视频一区日韩精品| 丝袜亚洲精品中文字幕一区| jiujiure精品视频播放| 国产激情在线播放| 樱桃视频成人在线观看| 国产精品magnet| 亚洲少妇在线| 欧美日韩在线网站| 私拍精品福利视频在线一区| 久久久91麻豆精品国产一区| 国产欧美日韩影院| 日韩一区二区三区精品视频第3页 日韩一区二区三区免费视频 | 亚洲在线免费| 91久久中文| 亚洲伊人精品酒店| 日韩精品久久久久久久软件91| 一区二区三区网站| 日韩午夜视频在线| 日本视频一区二区| 国产精品日韩精品在线播放| 国产精品九九| 激情中国色综合| 日本久久成人网| 久久久91麻豆精品国产一区| 精品美女在线视频| 麻豆视频在线观看免费网站黄| xxxxx性欧美特大| 亚洲精华国产欧美| 97se综合| 久久av影视| 久久精品亚洲人成影院| 国产九九精品| 欧美成人基地 | 国产免费av国片精品草莓男男| 欧美成人精品午夜一区二区| 综合日韩av| 蜜臀av亚洲一区中文字幕| 欧美aa在线视频| 欧美另类综合| 国产精成人品2018| 欧美在线影院| 久久av免费| 在线精品视频在线观看高清| 国产精品一区二区精品| 久久视频一区| 国产欧美日韩精品一区二区三区| 在线观看精品| 日韩精品久久久久久| 日韩精品第一区| 青青草91久久久久久久久| 日韩黄色大片网站| 欧美日韩亚洲在线观看| 亚洲成av人片一区二区密柚| 婷婷综合电影| 中日韩男男gay无套| 久久香蕉精品香蕉| 亚洲精品激情| 欧美va亚洲va日韩∨a综合色| 国产欧美日韩影院| 视频在线观看一区二区三区| 国产91欧美| 国产精品欧美三级在线观看| 日本免费久久| 国产精品高潮呻吟久久久久| 亚洲日本久久| 男人的天堂亚洲一区| 九九99久久精品在免费线bt| 日韩一区二区三区精品| 亚洲深夜福利在线观看| 国产视频亚洲| 免费av一区| 久久精品国产99久久| 日韩中文欧美| 深夜福利视频一区二区| 成人日韩av| 91久久精品无嫩草影院| 亚洲精品看片| 久久久久久久久久久9不雅视频| 国产精品久久久久久久久久白浆| 欧美久久精品一级c片| 亚洲欧美高清| 久久都是精品| 狠狠干成人综合网| 九九久久婷婷| 日韩天堂av| 黄色亚洲免费| 亚洲乱码一区| 国产精品多人| 久久久久免费| 一级欧洲+日本+国产| 激情五月综合网| 亚洲少妇在线| 日本不卡一二三区黄网| 日本精品久久| 成人在线视频区| 欧美中文一区二区| 视频在线观看91| 国产精品久久久久久久免费软件| 首页国产精品| 蜜臀av在线播放一区二区三区| 国产欧美91| 久久久精品久久久久久96| 午夜一级在线看亚洲| 国产精品亲子伦av一区二区三区 | 国产丝袜一区| 欧美福利专区| 午夜在线观看免费一区| 国产精品视频一区二区三区| 久久国产直播| 蜜桃久久av一区| 国产亚洲一区二区三区啪| 日韩在线二区| 国产日韩在线观看视频| 欧美精品中文字幕亚洲专区| 伊人久久av| 日韩高清不卡一区二区| 久久精品播放| 欧美激情日韩| 午夜久久av| 91成人精品| 精品欧美视频| 日韩一区精品字幕| 国产精选在线| 国产午夜一区| 成人小电影网站| 日本亚州欧洲精品不卡| 久久久亚洲一区| 成人亚洲一区二区| 国产精品片aa在线观看| 亚洲在线久久| 午夜精品亚洲| 日韩精品免费一区二区在线观看| 欧美亚洲专区| 亚洲乱亚洲高清| 亚洲精品在线二区| 亚洲综合日本| 91精品蜜臀一区二区三区在线 | 欧美日韩亚洲一区二区三区在线| 日韩久久精品| 97视频热人人精品免费| 精品久久精品| 超碰超碰人人人人精品| 在线天堂资源www在线污| 久久精品国产网站| 国内精品亚洲| 欧美少妇精品| 午夜国产欧美理论在线播放 | 国产精品亚洲综合色区韩国|