关于javajvm.dll的信息
本篇文章给大家谈谈javajvm.dll,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、java中jvm在哪?是包含在jdk里面吗?
- 2、无法安装JAVA 提示无法加载安装目录下的jvm.dll
- 3、java源代码分析----jvm.dll装载过程
- 4、java动态链接库连接失败 jvm.dll加载失败
- 5、jvm.dll详细资料大全
- 6、matlab 由于java 问题打不开 缺少 jvm.dll
java中jvm在哪?是包含在jdk里面吗?
简单来说Sun
java提供的JDK中包含有JVM,是其中的一个组成部分,更详细的看下面:
----------------------------------
操作系统装入jvm是通过jdk中java.exe来完成,通过下面4步来完成jvm环境.
1.创建jvm装载环境和配置
2.装载jvm.dll
3.初始化jvm.dll并挂界到JNIENV(JNI调用接口)实例
4.调用JNIEnv实例装载并处理class类。
在我们运行和调试java程序的时候,经常会提到一个jvm的概念.jvm是java程序运行的环境,但是他同时一个操作系统的一个应用程序一个进程,因此他也有他自己的运行的生命周期,也有自己的代码和数据空间.
首先来说一下jdk这个东西,不管你是初学者还是高手,是j2ee程序员还是j2se程序员,jdk总是在帮我们做一些事情.我们在了解java之前首先大师们会给我们提供说jdk这个东西.它在java整个体系中充当着什么角色呢?我很惊叹sun大师们设计天才,能把一个如此完整的体系结构化的如此完美.jdk在这个体系中充当一个生产加工中心,产生所有的数据输出,是所有指令和战略的执行中心.本身它提供了java的完整方案,可以开发目前java能支持的所有应用和系统程序.这里说一个问题,大家会问,那为什么还有j2me,j2ee这些东西,这两个东西目的很简单,分别用来简化各自领域内的开发和构建过程.jdk除了jvm之外,还有一些核心的API,集成API,用户工具,开发技术,开发工具和API等组成
好了,废话说了那么多,来点于主题相关的东西吧.jvm在整个jdk中处于最底层,负责于操作系统的交互,用来屏蔽操作系统环境,提供一个完整的java运行环境,因此也就虚拟计算机.
操作系统装入jvm是通过jdk中java.exe来完成,通过下面4步来完成jvm环境.
1.创建jvm装载环境和配置
2.装载jvm.dll
3.初始化jvm.dll并挂界到JNIENV(JNI调用接口)实例
4.调用JNIEnv实例装载并处理class类。
一.jvm装入环境,jvm提供的方式是操作系统的动态连接文件.既然是文件那就一个装入路径的问题,java是怎么找这个路径的呢?当你在调用java
test的时候,操作系统会在path下在你的java.exe程序,java.exe就通过下面一个过程来确定jvm的路径和相关的参数配置了.下面基于windows的实现的分析.
首先查找jre路径,java是通过GetApplicationHome
api来获得当前的java.exe绝对路径,c:\j2sdk1.4.2_09\bin\java.exe,那么它会截取到绝对路径c:\j2sdk1.4.2_09\,判断c:\j2sdk1.4.2_09\bin\java.dll文件是否存在,如果存在就把c:\j2sdk1.4.2_09\作为jre路径,如果不存在则判断c:\j2sdk1.4.2_09\jre\bin\java.dll是否存在,如果存在这c:\j2sdk1.4.2_09\jre作为jre路径.如果不存在调用GetPublicJREHome查HKEY_LOCAL_MACHINE\Software\JavaSoft\Java
Runtime
Environment\“当前JRE版本号”\JavaHome的路径为jre路径。
然后装载jvm.cfg文件JRE路径+\lib+\ARCH(CPU构架)+\jvm.cfgARCH(CPU构架)的判断是通过java_md.c中GetArch函数判断的,该函数中windows平台只有两种情况:WIN64的‘ia64’,其他情况都为‘i386’。以我的为例:C:\j2sdk1.4.2_09\jre\lib\i386\jvm.cfg.主要的内容如下:
-client
KNOWN
-server
KNOWN
-hotspot
ALIASED_TO
-client
-classic
WARN
-native
ERROR
-green
ERROR
在我们的jdk目录中jre\bin\server和jre\bin\client都有jvm.dll文件存在,而java正是通过jvm.cfg配置文件来管理这些不同版本的jvm.dll的.通过文件我们可以定义目前jdk中支持那些jvm,前面部分(client)是jvm名称,后面是参数,KNOWN表示jvm存在,ALIASED_TO表示给别的jvm取一个别名,WARN表示不存在时找一个jvm替代,ERROR表示不存在抛出异常.在运行java
XXX是,java.exe会通过CheckJvmType来检查当前的jvm类型,java可以通过两种参数的方式来指定具体的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的绝对路径。如果没有指定这会使用jvm.cfg中第一个定义的jvm.可以通过set
_JAVA_LAUNCHER_DEBUG=1在控制台上测试.
最后获得jvm.dll的路径,JRE路径+\bin+\jvm类型字符串+\jvm.dll就是jvm的文件路径了,但是如果在调用java程序时用-XXaltjvm=参数指定的路径path,就直接用path+\jvm.dll文件做为jvm.dll的文件路径.
二:装载jvm.dll
通过第一步已经找到了jvm的路径,java通过LoadJavaVM来装入jvm.dll文件.装入工作很简单就是调用windows
API函数:
LoadLibrary装载jvm.dll动态连接库.然后把jvm.dll中的导出函数JNI_CreateJavaVM和JNI_GetDefaultJavaVMInitArgs挂接到InvocationFunctions变量的CreateJavaVM和GetDefaultJavaVMInitArgs函数指针变量上。jvm.dll的装载工作宣告完成。
三:初始化jvm,获得本地调用接口,这样就可以在java中调用jvm的函数了.调用InvocationFunctions-CreateJavaVM也就是jvm中JNI_CreateJavaVM方法获得JNIEnv结构的实例.
四:运行java程序.
java程序有两种方式一种是jar包,一种是class.
运行jar,java
-jar
XXX.jar运行的时候,java.exe调用GetMainClassName函数,该函数先获得JNIEnv实例然后调用java类java.util.jar.JarFileJNIEnv中方法getManifest()并从返回的Manifest对象中取getAttributes("Main-Class")的值即jar包中文件:META-INF/MANIFEST.MF指定的Main-Class的主类名作为运行的主类。之后main函数会调用java.c中LoadClass方法装载该主类(使用JNIEnv实例的FindClass)。main函数直接调用java.c中LoadClass方法装载该类。如果是执行class方法。main函数直接调用java.c中LoadClass方法装载该类。
然后main函数调用JNIEnv实例的GetStaticMethodID方法查找装载的class主类中
“public
static
void
main(String[]
args)”方法,并判断该方法是否为public方法,然后调用JNIEnv实例的
CallStaticVoidMethod方法调用该java类的main方法。
无法安装JAVA 提示无法加载安装目录下的jvm.dll
jdk或jre版本下错,32位电脑下到64位jdk或jre,64位电脑下到32位jre或jdk,都可以发生这样的错误,用头脑,用头脑嘛,对不对,哎,真是令人鼻酸啦。
java源代码分析----jvm.dll装载过程
简述 众所周知java exe是java class文件的执行程序 但实际上java exe程序只是一个执行的外壳 它会装载jvm dll(windows下 以下皆以windows平台为例 linux下和solaris下其实类似 为 libjvm so) 这个动态连接库才是java虚拟机的实际操作处理所在 本文探究java exe程序是如何查找和装载jvm dll动态库 并调用它进行class文件执行处理的 源代码 本文分析之代码 《JavaTM SDK Standard Edition v fcsCommunity Source Release》 可从sun官方网站下载 主要分析的源代码为 j se\src\share\bin\java cj se\src\windows\bin\java_md c java c是什么东西 java程序 源代码所谓 java程序 包括jdk中的java exe\javac exe\javadoc exe java c源代码中通过JAVA_ARGS宏来控制生成的代码 如果该宏没定义则编译文件控制生成java exe否则编译文件控制生成其他的 java程序 比如 j se\make\java\javac\Makefile(这是javac编译文件)中 $(CD) / /sun/javac ; $(MAKE) $@ RELEASE=$(RELEASE) FULL_VERSION=$(FULL_VERSION)j se\make\sun\javac\javac\Makefile(由上面Makefile文件调用)中 JAVA_ARGS = { \ J ms m\ \ sun tools javac Main\ } 则由同一份java c代码生成的javac exe程序就会直接调用java类方法 sun tools javac Main 这样使其执行起来就像是直接运行的一个exe文件 而未定义JAVA_ARGS的java exe程序则会调用传递过来参数中的类方法 从java c的main入口函数说起 main()函数中前面一段为重新分配参数指针的处理 然后调用函数 CreateExecutionEnvironment 该函数主要查找java运行环境的目录 和jvm dll这个虚拟机核心动态连接库文件路径所在 根据操作系统不同 该函数有不同实现版本 但大体处理逻辑相同 我们看看windows平台该函数的处理(j se\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函数调用windowsAPI函数GetModuleFileName取java exe程序的绝对路径 以我的jdk安装路径为例 为 D:\java\j sdk _ \bin\java exe 然后去掉文件名取绝对路径为 D:\java\j sdk _ \bin 之后会在去掉最后一级目录 现在绝对路径为 D:\java\j sdk _ 然后GetJREPath函数继续判断刚刚取的路径+\bin\java dll组合成的这个java dll文件是否存在 如果存在则 D:\java\j sdk _ 为JRE路径 否则判断取得的 D:\java\j sdk _ 路径+\jre\bin\java dll文件是否存在 存在则 D:\java\j sdk _ \jre 为JRE路径 如果上面两种情况都不存在 则从注册表中去查找(参见函数GetPublicJREHome) 函数 GetPublicJREHome先查找 HKEY_LOCAL_MACHINE\Sofare\JavaSoft\Java Runtime Environment\CurrentVersion键值 当前JRE版本号 判断 当前JRE版本号 是否为 做为版本号 如果是则取HKEY_LOCAL_MACHINE\Sofare\JavaSoft\Java Runtime Environment\ 当前JRE版本号 \JavaHome的路径所在为JRE路径 我的JDK返回的JRE路径为 D:\java\j sdk _ \jre b 装载jvm cfg虚拟机动态连接库配置文件是通过java c中函数:ReadKnownVMs实现的 该函数首先组合jvm cfg文件的绝对路径 JRE路径+\lib+\ARCH(CPU构架)+\jvm cfgARCH(CPU构架)的判断是通过java_md c中GetArch函数判断的 该函数中windows平台只有两种情况 WIN 的 ia 其他情况都为 i 我的为i 所以jvm cfg文件绝对路径为 D:\java\j sdk _ \jre\lib\i \jvm cfg 文件内容如下 ## @(#)jvm cfg / / # # Copyright 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\j sdk _ \jre\bin\client 和 D:\java\j sdk _ \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 Jjvm 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\j sdk _ \jre\bin\client test 则ReadKnownVMs会直接返回 D:\java\j sdk _ \jre\bin\client 如果不带上面参数执行如 java test 因为在jvm cfg配置文件中第一个存在的jvm为 client 所以函数ReadKnownVMs也会去掉jvm名称前的 返回 client 其实这三中情况都是使用的 D:\java\j sdk _ \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\j sdk _ \jre + \bin + \client + \jvm dll 第二种情况 java XXaltjvm=D:\java\j sdk _ \jre\bin\client test 路径为 jvm类型字符串+\jvm dll即为 D:\java\j sdk _ \jre\bin\client + \jvm dll 第三种情况 java test 为 D:\java\j sdk _ \jre + \bin + \client + \jvm dll 与情况一相同 所以这三种情况都是调用的jvm动态连接库 D:\javaj sdk _ \jre\bin\client\jvm dll 处理test类的 我们来进一步验证一下 打开cmd控制台 设置java装载调试E:\work\java_researchset _JAVA_LAUNCHER_DEBUG= 情况一E:\work\java_researchjava J client test ScanDirectory _JAVA_LAUNCHER_DEBUG lishixinzhi/Article/program/Java/hx/201311/26750
java动态链接库连接失败 jvm.dll加载失败
项目中用到 Jpcap 库,这个库引用到一个 C 的链接库文件
链接库文件放到 /usr/lib 下面
以前在别的Linux系统下都运行的好好的
今天部署到一个 Centos 机器上就报错:java.lang.NoClassDefFoundError: Could not initialize class jpcap.JpcapCaptor 和 java.lang.unsatisfiedlinkerror
看了下 JpcapCaptor 类的源码发现里面有加载动态链接库的代码
肯定就是没找到 动态链接库文件了。
1.重新编译库文件 2.把库文件放到项目根目录,等等几番折腾
最后都要绝望的时候了,突然想起 /etc/ld.so.conf
vi 一看还真没有库目录
加上两行
/usr/lib
/usr/local/lib
保存 执行 ldconfig命令 生效
问题就这样解决了。
jvm.dll详细资料大全
jvm.dll一般存在于java目录中,是java程式运行的基础模组,通常情况下是在安装java(JRE、JDK)过程中自动创建的,对于java正常运行来说至关重要。不建议用户对该档案进行随意的修改。
基本介绍
外文名 :jvm.dll 档案大小 :根据java版本不同会有些变化 属于 :OLE 常见错误 :File Not Found 基本信息,修复方法,简述,错误危害, 基本信息 系统 DLL档案: 否 安全等级 (0-5): 2 间谍软体: 否 广告软体: 否 常见错误: , Missing File, Exception Errors 修复方法 1.下载Jvm.dll档案,放回目录(以JRE为例:X:\program files\java\jre7\bin\server) 2.重新安装JRE或JDK 简述 众所周知java.exe是java class档案的执行程式,但实际上java.exe程式只是一个执行的外壳。它会装载jvm.dll(windows下),这个动态连线库才是java虚拟机的实际操作处理所在。java.exe程式只负责查找和装载jvm.dll动态库,并调用它进行class档案执行处理。 错误危害 网页中的java控制项报错、所有基于java语言编写的程式均报错。
matlab 由于java 问题打不开 缺少 jvm.dll
MATLAB_JAVA只要配成C:\Program Files (x86)\Java\jre7就可以了。
你配的是: C:\Program Files (x86)\Java\jre1.7.0_17 和 C:\Program Files (x86)\Java\jre7
但只要配: C:\Program Files (x86)\Java\jre7
关于javajvm.dll和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
