锁定老帖子 主题:JAVA中的JDK和JVM
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (15)
|
|
---|---|
作者 | 正文 |
发表时间:2009-07-10
最后修改:2009-07-10
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环境.
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.主要的内容如下: 用path+\jvm.dll文件做为jvm.dll的文件路径. 二:装载jvm.dll 三:初始化jvm,获得本地调用接口,这样就可以在java中调用jvm的函数了.调 用InvocationFunctions->CreateJavaVM也就是jvm中JNI_CreateJavaVM方法获得 JNIEnv结构的实例. 四:运行java程序. 件: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的运行过程 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 5605 次