`
lx休止符
  • 浏览: 13414 次
  • 来自: dsadsa
最近访客 更多访客>>
社区版块
存档分类
最新评论

JAVA中的JDK和JVM【转】

 
阅读更多

1.任何一门语言的开发都需要提供基本的架构对其支持,在java中提供的是一个JDK的类库,它是java运行的核心,是java运行的控制者,它产生程序运行所需要的结果,控制程序的走向,是所有指令和战略的执行中心,它提供java完整的解决方案。它是一套完整的体系结构,包括JVM(java虚拟机)、核心API、集成API、Java工具

2.JVM是JDK的最底层,对java程序进行解释和运行,负责与操作系统进行交互,用来屏蔽操作系统环境,提供一个完整的java运行环境。因此也就JAVA虚拟计算机。Java虚拟机有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。 每个JVM都有两种机制,一个是装载具有合适名称的类(类或是接口),叫做类装载子系统;另外的一个负责执行包含在已装载的类或接口中的指令,叫做运行引擎

JVM体系结构:

 

 操作系统装入jvm是通过jdk中java.exe来完成,通过下面4步来完成jvm环境. 
1.创建jvm装载环境和配置 
2.装载jvm.dll 
3.初始化jvm.dll并挂界到JNIENV(JNI调用接口)实例 
4.调用JNIEnv实例装载并处理class类。

 

JVM:装入过程:

一.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 RuntimeEnvironment\“当前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变量的CreateJavaVMGetDefaultJavaVMInitArgs函数指针变量上。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方法。

 

JVM的运行过程

分享到:
评论

相关推荐

    Java中JDKJRE和JVM解析.doc

    Java中JDKJRE和JVM解析.doc

    jdk8 jvm 参数图(随手参考好资料)

    常用jvm参数都在这张图中,参考起来方便,是国外大神整理的

    JAVA 基础培训,JDK和JVM,核心类的介绍和使用

    JAVA 基础培训,JDK和JVM,核心类的介绍和使用。

    Java零基础 - JDK JRE JVM三者关系.md

    本文介绍了JDK、JRE和JVM之间的关系,并提供了相应的Java示例代码。 内容概要 本文档涵盖以下内容: JDK、JRE和JVM的概念和作用 JDK的组件和功能 JRE的组成和用途 JVM的作用和重要性 学到什么 通过阅读本文,您将...

    JDK和JVM以及线程储存方面

    JDK和JVM以及线程储存方面

    Java语言规范和JVM虚拟机规范.zip

    Java语言规范和JVM虚拟机规范.zip,Oracle官方文档,包括Java语法的定义等内容。Java语言规范包含JDK678三个版本,JVM虚拟机规范包含78两个版本。

    jdk_api_1.8-JAVA中文版API手册

    JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。 jdk1.8新特性 1)Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可。 2)新增lambda表达式 3)提供...

    详解Java中的JDK、JRE、JVM

    本文主要介绍了Java中的JDK、JRE、JVM的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧

    Java中JDK,JRE和JVM之间的关系

    初学JAVA很容易被其中的很多概念弄的傻傻分不清楚,首先从概念上理解一下吧,JDK(Java Development Kit)简单理解是Java开发工具包,JRE(Java Runtime Enviroment)是Java的运行环境,JVM( java virtual machine)也...

    JAVA8虚拟机(jvm)规范_Chinese version.rar

    java8虚拟机规范,适合中文较好的同学尝试,对虚拟机底层的知识进行接触及学习,俗话说的好,磨刀不误砍柴工,一起进步吧!!!

    Java JDK常见问题集锦

    与JDK1.1不同的是:设置好JAVA_HOME环境变量后,JVM将自动搜索系统类库以及用户的当前路径. Java 2环境变量的设置如下例所示: Solaris平台: setenv JAVA_HOME Java2的安装路径 setenv PATH $JAVA_HOME/bin:${;PATH}; ...

    Java+JDK+7学习笔记_林信良编著.pdf

    并详细介绍了jvm、jre、java se api、jdk与ide之间的对照关系。必要时从java se api的源代码分析,了解各种语法在java se api中如何应用。对于建议练习的范例提供lab文档,以突出练习重点。此外,书中还将ide操作纳...

    Java Linux系统 jdk

    JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。这个是Linux系统安装的jdk

    java环境中的JDK、JVM、JRE详细介绍

    主要介绍了java环境中的JDK、JVM、JRE详细介绍的相关资料,对于初学者还是有必要了解下,细致说明他们是什么,需要的朋友可以参考下

    JDK是 Java 语言的软件开发工具包,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具 (java8)

    jdk是 java 的开发工具,全称为Java Development Kit,包含java运行环境,java工具,java基础类库三大部分。 java运行环境,也就是jre,全称为Java Runtime Environment,其中包含jvm(Java Virtual Machine)...

    java jdk8 学习笔记

    5.从大到小,包含与被包含:java se:java 语言、jdk(jre(jvm,java se api))。jdk包含了java程序语言、工具程序与jre,jre包括了部署技术、java se api与jvm。 6. 7.Web容器是Servlet/JSP唯一认识的HTTP服务器,...

    JVM 参数详解-基于jdk1.7

    (中英文)JVM 参数详解,用心整理成Excel文档。包含所有近100条JVM参数的详细说明及设置方法,中英文对照,极方便阅读。转载请标明我这的源地址:http://download.csdn.net/download/xiucaiyao/10257573

    java jdk1.7windows免安装版下载

    5、改进的JVM:JDK 7提供了许多新的JVM特性,包括增强的垃圾回收器,更好的性能监视和分析工具以及对其他语言的支持。 6、对多核处理器的支持:JDK 7提供了对多核处理器的支持,包括fork-join框架,以帮助开发人员更...

    JVM高级特性与最佳实践第二版+JDK1.8_API_DOC

    里面包含 深入理解Java虚拟机:JVM高级特性与最佳实践第二版 高清PDF + JDK1.8中文帮助文档

    64位JDKJAVA

    JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。

Global site tag (gtag.js) - Google Analytics