首页 > PHP资讯 > JAVA培训 > JVM工作原理和特点探究(1)

JVM工作原理和特点探究(1)

JAVA培训

  我们运行和调试Java程序的时候,经常会提到一个JVM的概念,这里向大家描述一下JVM工作原理和特点,Java虚拟机(JVM)一种用于计算设备的规范,可用不同的方式(软件或硬件)加以实现。

  JVM工作原理和特点

  我们运行和调试Java程序的时候,经常会提到一个JVM的概念.JVM是Java程序运行的环境,但是他同时一个操作系统的一个应用程序一个进程,因此他也有他自己的运行的生命周期,也有自己的代码和数据空间.

  首先来说一下JVM工作原理中的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是怎么找这个路径的呢?当你在调用Javatest的时候,操作系统会在path下在你的Java.exe程序,Java.exe就通过下面一个过程来确定JVM的路径和相关的参数配置了.下面基于Windows的实现的分析.

  ◆首先查找jre路径,Java是通过GetApplicationHomeapi来获得当前的Java.exe绝对路径,c:j2sdk1.4.2_09inJava.exe,那么它会截取到绝对路径c:j2sdk1.4.2_09,判断c:j2sdk1.4.2_09inJava.dll文件是否存在,如果存在就把c:j2sdk1.4.2_09作为jre路径,如果不存在则判断c:j2sdk1.4.2_09jreinJava.dll是否存在,如果存在这c:j2sdk1.4.2_09jre作为jre路径.如果不存在调用GetPublicJREHome查HKEY_LOCAL_MACHINESoftwareJavaSoftJavaRuntimeEnvironment“当前JRE版本号”JavaHome的路径为jre路径。

  ◆然后装载JVM.cfg文件JRE路径+lib+ARCH(CPU构架)+JVM.cfgARCH(CPU构架)的判断是通过Java_md.c中GetArch函数判断的,该函数中windows平台只有两种情况:WIN64的‘ia64’,其他情况都为‘i386’。以我的为例:C:j2sdk1.4.2_09jrelibi386JVM.cfg.主要的内容如下:

  -clientKNOWN-serverKNOWN-hotspotALIASED_TO-client-classicWARN-nativeERROR-greenERROR在我们的jdk目录中jreinserver和jreinclient都有JVM.dll文件存在,而Java正是通过JVM.cfg配置文件来管理这些不同版本的JVM.dll的.通过文件我们可以定义目前jdk中支持那些JVM,前面部分(client)是JVM名称,后面是参数,KNOWN表示JVM存在,ALIASED_TO表示给别的JVM取一个别名,WARN表示不存在时找一个JVM替代,ERROR表示不存在抛出异常.

  ◆在运行JavaXXX是,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路径+in+JVM类型字符串+JVM.dll就是JVM的文件路径了,但是如果在调用Java程序时用-XXaltJVM=参数指定的路径path,就直接用path+JVM.dll文件做为JVM.dll的文件路径.

欣才java培训机构 http://www.thinksite.cn/list-114-1.html)

本文由欣才IT学院整理发布,未经许可,禁止转载。