电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:90日期: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的全路徑。看看上面的例子,第一種情況“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
相關文章:
主站蜘蛛池模板: 实战IT培训机构_IT培训班选大学生IT技术培训中心_中公优就业 | 篷房|仓储篷房|铝合金篷房|体育篷房|篷房厂家-华烨建筑科技官网 知名电动蝶阀,电动球阀,气动蝶阀,气动球阀生产厂家|价格透明-【固菲阀门官网】 | 杭州ROHS检测仪-XRF测试仪价格-百科| 小青瓦丨古建筑瓦丨青瓦厂家-宜兴市徽派古典建筑材料有限公司 | HV全空气系统_杭州暖通公司—杭州斯培尔冷暖设备有限公司 | DAIKIN电磁阀-意大利ATOS电磁阀-上海乾拓贸易有限公司 | 上海办公室装修公司_办公室设计_直营办公装修-羚志悦装 | 济南宣传册设计-画册设计_济南莫都品牌设计公司 | 优考试_免费在线考试系统_培训考试系统_题库系统_组卷答题系统_匡优考试 | 恒湿机_除湿加湿一体机_恒湿净化消毒一体机厂家-杭州英腾电器有限公司 | 重庆私家花园设计-别墅花园-庭院-景观设计-重庆彩木园林建设有限公司 | 武汉画册印刷厂家-企业画册印刷-画册设计印刷制作-宣传画册印刷公司 - 武汉泽雅印刷厂 | 臭氧老化试验箱,高低温试验箱,恒温恒湿试验箱,防水试验设备-苏州亚诺天下仪器有限公司 | 电销卡 防封电销卡 不封号电销卡 电话销售卡 白名单电销卡 电销系统 外呼系统 | 全自动实验室洗瓶机,移液管|培养皿|进样瓶清洗机,清洗剂-广州摩特伟希尔机械设备有限责任公司 | 水篦子|雨篦子|镀锌格栅雨水篦子|不锈钢排水篦子|地下车库水箅子—安平县云航丝网制品厂 | 5L旋转蒸发器-20L-50L旋转蒸发器-上海越众仪器设备有限公司 | 硅PU球场、篮球场地面施工「水性、环保、弹性」硅PU材料生产厂家-广东中星体育公司 | 金联宇电缆|广东金联宇电缆厂家_广东金联宇电缆实业有限公司 | 沈阳缠绕膜价格_沈阳拉伸膜厂家_沈阳缠绕膜厂家直销 | 有机肥设备生产制造厂家,BB掺混肥搅拌机、复合肥设备生产线,有机肥料全部加工设备多少钱,对辊挤压造粒机,有机肥造粒设备 -- 郑州程翔重工机械有限公司 | 沈阳庭院景观设计_私家花园_别墅庭院设计_阳台楼顶花园设计施工公司-【沈阳现代时园艺景观工程有限公司】 | 粉末包装机-给袋式包装机-全自动包装机-颗粒-液体-食品-酱腌菜包装机生产线【润立机械】 | 桥架-槽式电缆桥架-镀锌桥架-托盘式桥架 - 上海亮族电缆桥架制造有限公司 | 搜木网 - 木业全产业链交易平台,免费搜货、低价买货! | 微动开关厂家-东莞市德沃电子科技有限公司 | 学生作文网_中小学生作文大全与写作指导 | 宝元数控系统|对刀仪厂家|东莞机器人控制系统|东莞安川伺服-【鑫天驰智能科技】 | ◆大型吹塑加工|吹塑加工|吹塑代加工|吹塑加工厂|吹塑设备|滚塑加工|滚塑代加工-莱力奇塑业有限公司 | 深圳富泰鑫五金_五金冲压件加工_五金配件加工_精密零件加工厂 | 百方网-百方电气网,电工电气行业专业的B2B电子商务平台 | 生态板-实木生态板-生态板厂家-源木原作生态板品牌-深圳市方舟木业有限公司 | 超细粉碎机|超微气流磨|气流分级机|粉体改性设备|超微粉碎设备-山东埃尔派粉碎机厂家 | 盘式曝气器-微孔曝气器-管式曝气器-曝气盘-斜管填料 | 郑州市前程水处理有限公司 | 北京律师事务所_房屋拆迁律师_24小时免费法律咨询_云合专业律师网 | 电磁铁_小型推拉电磁铁_电磁阀厂家-深圳市宗泰电机有限公司 | 消泡剂_水处理消泡剂_切削液消泡剂_涂料消泡剂_有机硅消泡剂_广州中万新材料生产厂家 | 猎头招聘_深圳猎头公司_知名猎头公司| 中空玻璃生产线,玻璃加工设备,全自动封胶线,铝条折弯机,双组份打胶机,丁基胶/卧式/立式全自动涂布机,玻璃设备-山东昌盛数控设备有限公司 | 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 | 生物制药洁净车间-GMP车间净化工程-食品净化厂房-杭州波涛净化设备工程有限公司 |