`

一步一步深入jvm(3)—jvm装载过程【转】

    博客分类:
  • jvm
阅读更多

操作系统装入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_md.c】来获得当前的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路径。
   备注获取当前jre路径的方法为System.out.println(System.getProperty("java.home"));

   然后装载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方法。

 

浅谈jvm.dll装载过程与源代码分析请点击一下链接

http://developer.51cto.com/art/200907/134773.htm

分享到:
评论

相关推荐

    深入jvm 内核-原理,诊断于优化视频教程

    ### 深入JVM内核:原理、诊断与优化 #### 一、JVM基础知识 **1.1 JVM概念** Java虚拟机(Java Virtual Machine,简称JVM)是一种用于执行Java字节码的虚拟机。它为Java程序提供了一个运行环境,能够独立于硬件平台...

    深入JVM内核—原理、诊断与优化

    《深入JVM内核—原理、诊断与优化》是一份深度探索Java虚拟机(JVM)的视频教程,旨在帮助开发者全面理解JVM的工作机制,掌握性能诊断技巧,并能进行有效的优化。本教程覆盖了从基础到高级的JVM主题,不仅适用于Java...

    深入JVM内核—原理、诊断与优化视频教程-6. 类装载器

    本教程聚焦于深入理解JVM内核,特别是类装载器的原理、诊断与优化。在这个第六部分中,我们将探讨以下几个核心知识点: 1. **类装载器的层次结构**:Java的类装载器采用双亲委派模型,即当一个类装载器接到加载类的...

    深入JVM概要 JVM详解

    深入JVM概要 JVM详解 本文将详细介绍Java虚拟机(JVM)的内部机理和实现原理,从类型的生命周期、方法区、常量池、类加载器、垃圾收集器、栈和局部变量等方面对JVM进行深入解析。 类型的生命周期 类型的生命周期...

    [转载]深入理解JVM

    ### 深入理解JVM #### 一、Java技术与Java虚拟机 Java不仅仅是一种编程语言,更是一项综合性的技术。它主要包括四个关键组成部分: 1. **Java编程语言**:这是一种面向对象的编程语言,提供了丰富的类库支持,...

    jvm类装载器原理

    《JVM类装载器原理详解》 Java的JVM(Java Virtual Machine)类装载器是...总之,深入理解JVM的类装载器原理,不仅有助于我们更好地理解和调试Java程序,也有助于我们在实际开发中实现更加高效和灵活的类管理机制。

    深入理解JVM.

    深入理解JVM,首先要明白Java技术的组成部分,包括Java编程语言、Java类文件格式、Java虚拟机(JVM)和Java应用程序接口(Java API)。这些组件共同构成了Java平台,使得Java程序能够实现跨平台运行。 Java虚拟机是...

    深入JVM整理文档

    ### 深入理解JVM:Java虚拟机详解 #### 1、Java与JVM介绍 **JVM**,即Java Virtual Machine(Java虚拟机),是用于计算设备的一种规范,它是一个通过在实际计算机上仿真模拟各种计算机功能来实现的虚拟计算机。...

    深入JVM内核 - 原理、诊断与优化

    介绍了Java堆的分析方法,以一个实例为基础,展示对堆的分析过程。 第九课 锁 baise锁 轻量级锁 自旋锁 介绍JVM中对多线程锁的实现。 第十课 class文件结构 ASM库介绍 介绍JVM规范中的最重要的内容——Class文件...

    深入理解JVM

    3. **运行时数据区**:JVM在运行过程中会创建多个区域,如程序计数器、虚拟机栈、本地方法栈、堆和方法区(在Java 8后被元空间取代)。每个区域都有特定的功能,例如,堆存储对象实例,栈用于方法调用。 4. **内存...

    java深度历险,深入jvm

    《Java深度历险》这本书是Java开发者深入了解JVM(Java虚拟机)的重要参考资料,它以繁体中文的形式呈现,旨在帮助读者深入理解Java程序在运行时的内部机制。JVM作为Java平台的核心部分,负责执行字节码并提供运行...

    jvm_code深入理解.zip

    《深入理解JVM虚拟机》是一本深受Java开发者喜爱的经典著作,它详尽地剖析了Java虚拟机的工作原理,帮助读者提升对Java程序运行机制的深入理解。这本书的第二版更是加入了更多最新的JVM特性,使得学习内容更加全面且...

    java虚拟机深入JVM内核—原理、诊断与优化视频教程网盘下载

    深入理解JVM内核的原理、诊断与优化对于提升Java应用的性能至关重要。本教程将带你探索JVM的奥秘,从内存管理到垃圾回收,从编译优化到故障排查,全方位解析JVM的工作机制。 一、JVM结构与原理 1. 类装载子系统:...

    java-jvm虚拟机原理.ppt

    本篇文章将深入探讨JVM的生命周期、体系结构、类加载机制、内存区域以及垃圾收集。 首先,JVM的生命周期与Java程序紧密关联。每当运行一个Java程序时,就会创建一个JVM实例。这个实例在程序执行期间存在,直到程序...

    深入理解 JVM 机制

    JVM的运行过程大致分为以下几个步骤:首先,开发者使用Java语言编写源代码,然后通过编译器将源代码编译成字节码(.class文件)。字节码是平台无关的,可以在任何安装了JVM的系统上运行。当程序启动时,JVM会加载...

    jvm视频及笔记

    "jvm视频及笔记"这个资源显然是一份全面学习JVM的材料,结合了视频教程和书面笔记,帮助学习者深入理解JVM的工作原理及其在实际开发中的应用。 JVM的学习可以从以下几个重要的知识点开始: 1. **JVM架构**:JVM...

    深入JVM内核-原理、诊断与优化ppt.zip

    《深入JVM内核——原理、诊断与优化》是一份深度探讨Java虚拟机核心机制、问题诊断和性能优化的专业资料。这份资料涵盖了JVM的各个方面,对于Java开发者来说,理解和掌握这些知识至关重要。 首先,我们要了解JVM...

Global site tag (gtag.js) - Google Analytics