动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息



本月文章推荐
.[JAVA100例]017、文件对话框.
.Spring AOP在DWR安全上的应.
.JDBC Error establishing socket.
.对比C++和Java.
.有人看过2001 的书吗?.
.闲话Java中的类型转换.
.JDBC3.0 新特性.
.关于J2EE层次设计架构实例分析详.
.[JAVA100例]047、使用JavaMail发.
.Hibernate自关联关系.
.Java应用程序中的按值传递语义.
.STRUTS 入门教学(2).
.用多线程又有几种常用的编程模型.
.SUN公司操作系统的发展战略.
.Java综合:讨论关于Java占用内存.
.JBuilder2005单元测试之创建测试.
.关于Eclipse插件开发之定制向导(.
.java、J2EE基础问题汇总.
.在 FreeBSD 4.9 下安装JAVA环境.
.getHours 方法.

java源代码分析----jvm.dll装载过程

发表日期:2008-1-5 |



  简述
  
  众所周知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 fcs
  Community Source Release》,可从sun官方网站下载,主要分析的源代码为:
  j2se\src\share\bin\java.c
  j2se\src\windows\bin\java_md.c
  
  java.c是什么东西
  
  ‘java程序’源代码
  所谓‘java程序’,包括jdk中的java.exe\javac.exe\javadoc.exe,java.c源
  代码中通过JAVA_ARGS宏来控制生成的代码,假如该宏没定义则编译文件控制生
  成java.exe否则编译文件控制生成其他的‘java程序’。
  比如:
  j2se\make\java\javac\Makefile(这是javac编译文件)中:
  $(CD) ../../sun/javac ; $(MAKE) $@ RELEASE=$(RELEASE) FULL_VERSION=$(FULL_VERSION)
  j2se\make\sun\javac\javac\Makefile(由上面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平台该函数的处
  理(j2se\src\windows\bin\java_md.c)。
  
  CreateExecutionEnvironment函数主要分为三步处理:
  a、查找jre路径。
  b、装载jvm.cfg中指定的虚拟机动态连接库(jvm.dll)参数。
  c、取jvm.dll文件路径。
  
  实现:
  
  a、查找jre路径是通过java_md.c中函数:GetJREPath实现的。
  该函数首先调用GetApplicationHome函数,GetApplicationHome函数调用windows
  API函数GetModuleFileName取java.exe程序的绝对路径,以我的jdk安装路径为例,
  为:“D:\java\j2sdk1.4.2_04\bin\java.exe”,然后去掉文件名取绝对路径为:
  “D:\java\j2sdk1.4.2_04\bin”,之后会在去掉最后一级目录,现在绝对路径为:
  “D:\java\j2sdk1.4.2_04”。
  然后GetJREPath函数继续判定刚刚取的路径+\bin\java.dll组合成的这个java.dll
  文件是否存在,假如存在则“D:\java\j2sdk1.4.2_04”为JRE路径,否则判定取得
  的“D:\java\j2sdk1.4.2_04”路径+\jre\bin\java.dll文件是否存在,存在则
  “D:\java\j2sdk1.4.2_04\jre”为JRE路径。假如上面两种情况都不存在,则从注
  册表中去查找(参见函数GetPublicJREHome)。
  
  函数:GetPublicJREHome先查找
  HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment\CurrentVersion
  键值“当前JRE版本号”,判定“当前JRE版本号”是否为1.4做为版本号,假如是则
  取HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment\“当前JRE版本号”
  \JavaHome的路径所在为JRE路径。
  
  我的JDK返回的JRE路径为:“D:\java\j2sdk1.4.2_04\jre”。
  
  b、装载jvm.cfg虚拟机动态连接库配置文件是通过java.c中函数:ReadKnownVMs实现
  的。
  该函数首先组合jvm.cfg文件的绝对路径,JRE路径+\lib+\ARCH(CPU构架)+\jvm.cfg
  ARCH(CPU构架)的判定是通过java_md.c中GetArch函数判定的,该函数中windows平
  台只有两种情况:WIN64的‘ia64’,其他情况都为‘i386’。我的为i386所以jvm.cfg
  文件绝对路径为:“D:\java\j2sdk1.4.2_04\jre\lib\i386\jvm.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=<jvm_dir>" 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:\java\j2sdk1.4.2_04\jre\bin\client”和“D:\java\j2sdk1.4.2_04\jre\bin\server”两个目录下都存在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<jvm.cfg中jvm名称>”、“java -XXaltjvm=<jvm类型名称>”或“java -J-XXaltjvm=<jvm类型名称>”。假如是第一种参数传递方式,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:\java\j2sdk1.4.2_04\jre\bin\client test”,则ReadKnownVMs
  会直接返回“D:\java\j2sdk1.4.2_04\jre\bin\client”;假如不带上面参数执行如:
  “java test”,因为在jvm.cfg配置文件中第一个存在的jvm为“-client”,所以函数
  ReadKnownVMs也会去掉jvm名称前的“-”返回“client”。其实这三中情况都是使用的
  “D:\java\j2sdk1.4.2_04\jre\bin\client\jvm.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 test”jvm.dll路径为:
  JRE路径+\bin+\jvm类型字符串+\jvm.dll 按照我的JDK路径则为:
  “D:\java\j2sdk1.4.2_04\jre”+“\bin”+“\client”+“\jvm.dll”。
  第二种情况“java -XXaltjvm=D:\java\j2sdk1.4.2_04\jre\bin\client test”路径为:
  jvm类型字符串+\jvm.dll即为:“D:\java\j2sdk1.4.2_04\jre\bin\client”+“\jvm.dll”
  第三种情况“java test”为:“D:\java\j2sdk1.4.2_04\jre”+“\bin”+“\client”
  +“\jvm.dll”与情况一相同。所以这三种情况都是调用的jvm动态连接库“D:\javaj2sdk1.4.2_04\jre\bin\client\jvm.dll”处理test类的。
  
  我们来进一步验证一下:
  打开cmd控制台:
  
  设置java装载调试
  E:\work\java_research>set _JAVA_LAUNCHER_DEBUG=1
  
  情况一
  E:\work\java_research>java -J-client test.ScanDirectory
  ----_JAVA_LAUNCHER_DEBUG----

上一篇:Java的垃圾回收机制详解和调优 人气:425
下一篇:JVM的垃圾回收机制详解和性能调优 人气:393
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-7-9 顶级域名交易系统 v3.0 完整版
2008-7-9 ACTCMS网站管理系统 v2.0 Build
2008-7-9 Roclog v3.1.4 build 20080706
2008-7-9 乐彼网上开店系统(56770 Eshop)
2008-7-9 深度学习alexa排名提升专家 v1.0
2008-7-9 BBSXP 2008 Build 8.0.5 正式版
2008-7-9 一句话快速信息发布系统 修正完美
2008-7-9 ACTCMS网站管理系统 v2.0 Build
2008-7-9 乐涛涛留言本 08版
2008-7-5 AgileMessenger即时通讯工具 v1.
2008-7-5 GoodCalculator2.0版固件计算器
2008-7-5 RepoName源地址搜索工具 v1.21b
2008-7-5 AgileMessenger即时通讯工具 v1.
2008-7-5 TouchCopy多媒体管理软件 v3.13完
2008-7-5 VideosTone视频铃声 v1.1汉化破解
2008-7-5 TouchPad触摸板 v4.44破解版
2008-7-5 VideosTone破解补丁 v1.0
2008-7-5 Feeds GoogleReader客户端 v0.4.3


  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報