`

jvm.dll 加载过程

jvm 
阅读更多

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:\java\j2sdk1.4.2_04\jre\lib\i386\jvm.cfg”。文件内容如下:

  1. ##@(#)jvm.cfg 1.703/01/23##Copyright2003SunMicrosystems,
  2. Inc.Allrightsreserved.
  3. #SUNPROPRIETARY/CONFIDENTIAL.Useissubjecttolicenseterms.
  4. #####ListofJVMsthatcanbeusedasanoptiontojava,javac,etc.
  5. #Orderisimportant--irstinthislististhedefaultJVM.
  6. #NOTEthatthisboththisfileanditsformatareUNSUPPORTEDand
  7. #WILLGOAWAYinafuturerelease.
  8. ##YoumayalsoselectaJVMinanarbitrarylocationwiththe
  9. #"-XXaltjvm="option,butthattooisunsupported
  10. #andmaynotbeavailableinafuturerelease.
  11. #-clientKNOWN-serverKNOWN-hotspotALIASED_TO-client-
  12. classicWARN-nativeERROR-greenERROR

(如果细心的话,我们会发现在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虚拟机名称,第二部分为配置参数,比如行:“-clientKNOWN”则“-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-clienttest”则ReadKnownVMs会读取参数“-client”然后查找jvm.cfg读入的参数中是否有jvm名称为“-client”的,如果有则去掉jvm名称前的“-”直接返回“client”;而如果在运行java程序时使用如下参数:“java-XXaltjvm=D:\java\j2sdk1.4.2_04\jre\bin\clienttest”,则ReadKnownVMs会直接返回“D:\java\j2sdk1.4.2_04\jre\bin\client”;如果不带上面参数执行如:“javatest”,因为在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-clienttest”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\clienttest”路径为:jvm类型字符串+\JVM.dll即为:“D:\java\j2sdk1.4.2_04\jre\bin\client”+“\JVM.dll”第三种情况“javatest”为:“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-clienttest.ScanDirectory----_JAVA_LAUNCHER_DEBUG----

分享到:
评论

相关推荐

    jvm.dll文件

    当你在尝试运行一个Java应用程序时,如果出现“无法加载 `jvm.dll`”的错误,通常意味着系统无法找到或正确识别这个动态链接库文件,这可能是由于多种原因造成的。 首先,错误提示建议检查JDK的版本。`jvm.dll` ...

    ebs原版本jvm.dll文件

    - **备份当前文件**:在进行任何更改之前,请先备份现有的 `jvm.dll` 文件,以防万一升级过程中出现问题。 - **下载并安装新版本**:根据官方文档的指引,下载并安装最新的 JInitiator 和 JVM。 - **测试兼容性**:...

    gdal.jar, gdalconstjni.dll, gdaljni.dll, ogrjni.dll

    在配置GDAL环境时,需要将这些文件放置在Java的类路径(classpath)和系统路径(PATH)中,确保Java虚拟机(JVM)能够找到并加载它们。此外,根据应用需求,可能还需要其他依赖库,例如支持特定数据格式的DLL文件。 ...

    64位与32位 rxtxserial.dll/rxtxParallel.dll

    开发者在构建支持串口和并口通信的Java应用时,需要将这个jar文件与他们的Java项目一起包含,以确保Java虚拟机(JVM)能够在运行时找到并加载正确的本机库。 使用RXTX库进行串口或并口通信时,开发者可以利用Java的...

    rxtxSerial.dll,rxtxParallel.dll win64

    将这两个文件放入该目录后,Java虚拟机(JVM)在启动时能够自动找到并加载它们,从而使程序能够正确执行串行或并行通信的相关功能。 在处理这个问题时,用户需要确保下载的是与系统匹配的64位版本的rxtxSerial.dll...

    将rxtxSerial.dll和rxtxParallel.dll下载

    在Windows系统上,当你需要在Java程序中实现串行或并行通信时,需要将对应的DLL文件放在系统路径或者Java的类路径(Classpath)下,这样Java虚拟机在运行时才能找到并加载这些库,从而允许程序执行硬件通信操作。...

    windows64位 rxtxserial.dll、rxtxParallel.dll

    `rxtxSerial.dll` 是RXTX库中的串口通信组件,它实现了Java虚拟机(JVM)与系统串行端口之间的桥梁。而`rxtxParallel.dll` 则对应并行通信功能,允许程序通过并行端口进行数据传输。这两个文件对于运行依赖于RXTX的...

    IntelliJ IDEA 2019.3.1 x64 启动 failed to load jvm dll 用管理员才能打开的根本解决办法

    正常安装和配置JDK后,IntelliJ IDEA 2019.3.1 x64 启动仍然报 Failed to load JVM DLL 路径\jvm.dll if you already have a 64-bit JDK installed, define a JAVA_HOME variable in 系统 ... 必须用管理员才能打开...

    tcnative-1.dll 32位 and tcnative-1.dll 64位

    2. **负载减少**:使用tcnative-1.dll可以减轻Java虚拟机(JVM)的负担,因为一些计算密集型任务被转移到了本地代码上。 3. **OpenSSL支持**:tcnative-1.dll提供了对OpenSSL库的访问,允许使用更多先进的加密算法和...

    tcnative-1.dll 1.2.16下载 1.2.14可用

    - **SSL加速**:特别是对于处理大量SSL连接的服务器,tcnative-1.dll可以显著提高SSL握手的速度,减轻JVM的压力。 2. **版本差异**: - **1.2.16**:这个版本可能包含了最新的bug修复,安全更新,或者增加了对新...

    hsdis-amd64.dll

    它揭示了字节码在JVM中的实际执行过程,使开发者能更深入地了解类加载、方法调用、变量存储等核心概念。结合其他JVM工具如jmap、jstack和jhat,开发者可以构建一个全面的视图,理解Java应用程序的运行全貌。 总的来...

    TSC打印机驱动和dll_TSCLib.dll_TSC驱动_jna_TSCActiveX下载_

    这会指示JVM在指定的目录(通常是项目bin目录)下寻找并加载`TSCLib.dll`。 `TSCActiveX`是另一种与TSC打印机交互的方式,它是基于ActiveX技术的控件。ActiveX是Microsoft开发的一种技术,允许在应用程序中嵌入和...

    jacob 1.180 jacob-1.18-x64.dll jacob-1.18-x86.dll

    安装和使用Jacob时,需要将对应的DLL文件添加到系统的PATH环境变量中,或者将DLL文件放在Java虚拟机(JVM)可直接找到的目录下,比如与主类文件相同的目录。此外,还需要在Java代码中引入Jacob的Java库,通常通过...

    libzmq_d.dll和jzmq.dll

    在Java项目中,要使用这两个dll文件,你需要将它们放置在系统的PATH环境变量所包含的目录下,或者直接放在Java虚拟机(JVM)可找到的地方,例如与你的Java可执行文件同一目录。如果你使用的是IDE(如Eclipse或...

    java 串口开发需要的64位 rxtxSerial.dll

    对于64位系统,你需要64位版本的`rxtxSerial.dll`,因为它与运行在64位JVM上的Java应用程序兼容。这个动态链接库(DLL)是RXTX库在Windows平台上的实现,用于处理串行I/O操作。 使用RXTX库进行Java串口开发,首先...

    jacob-1.18-x64.dll下载

    通常,当Java应用程序尝试使用Jacob时,如果没有在系统路径中指定DLL的位置,那么需要将DLL放置在Java可执行文件的同一目录下或者系统路径中的某个位置,以便Java虚拟机(JVM)可以自动加载。 要使用Jacob操作Word...

    jacob-1.17-M2-x64.dll

    1. 添加Jacob的JAR文件到Java项目的类路径中,以便Java虚拟机(JVM)能够找到并加载Jacob的Java接口。 2. 将jacob-1.17-M2-x64.dll文件放置到系统的PATH环境变量所包含的任意目录下,或者放置到Java应用的同一目录下...

    IKVM.OpenJDK.ClassLibrary.dll

    - 调用Java代码:通过IKVM.Runtime.JNIEnv类,可以初始化Java环境,并使用Java.lang.ClassLoader加载Java类。然后,可以使用JavaMethod、JavaField等对象来调用Java方法或访问Java字段。 - 类型转换:IKVM.NET提供...

    msjava.dll 完整版

    2. **Web浏览器兼容**: 当用户访问包含Java applet的网页时,这个DLL文件帮助浏览器加载并运行这些小应用程序,实现交互式内容。 3. **应用程序组件**: 许多第三方软件依赖于msjava.dll来运行其Java相关的组件或...

    JVM崩溃

    标题中的“JVM崩溃”指的是Java虚拟机(Java Virtual Machine)在运行过程中遇到了无法处理的错误,导致程序异常终止的现象。这通常是由于内存溢出、类装载错误、线程死锁或其他严重问题引起的。理解JVM崩溃的原因和...

Global site tag (gtag.js) - Google Analytics