JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境.
1.创建JVM装载环境和配置
2.装载JVM.dll
3.初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例
4.调用JNIEnv实例装载并处理class类。
在我们运行和调试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是怎么找这个路径的呢?当你在调用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方法。
JVM工作原理和特点介绍到这里。
转自:http://developer.51cto.com/art/200907/135143.htm
分享到:
相关推荐
了解这些语言在JVM上的运行特点和优化策略,可以帮助开发者选择更适合的工具。 通过这个视频教程,开发者可以深化对JVM的理解,提高解决问题的能力,从而更好地利用JVM平台开发高效、稳定的应用程序。无论是日常...
本教程旨在帮助开发者深入了解JVM的工作原理及其内部机制,掌握JVM调优的方法和技术。通过学习本教程,开发者不仅能够提高自己的技术水平,还能更好地应对实际工作中遇到的问题。希望各位能够在学习过程中不断探索、...
Java虚拟机(JVM)是Java程序运行的核心组件,它...了解JVM的工作原理和内存模型对于优化Java程序的性能至关重要。通过调整JVM参数,开发者可以改善程序的启动时间、内存使用效率和响应速度,从而提升整体应用的性能。
通过对JVM的深入了解,可以帮助开发者更好地解决实际工作中遇到的问题,提高系统的稳定性和性能。 以上内容仅为概述,具体细节还需要结合实际场景进行深入学习和实践。希望本教程能够为读者提供有价值的指导和帮助...
"浅谈JAVA虚拟机JVM及工作原理" Java虚拟机(JVM)是Java语言的 runtime 环境,它提供了一个平台...通过对 JVM 的架构和工作原理的了解,我们可以更好地理解 Java 程序的执行过程,从而更好地编写和优化 Java 程序。
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 Java语言的一个非常重要的特点就是与平台的...
本文将详细探讨Tomcat的性能优化策略以及JVM内存的工作原理,旨在帮助运维人员和开发人员更好地理解和优化他们的Java应用。 首先,优化Java代码是性能提升的基础。避免过度的循环嵌套、减少不必要的函数调用以及...
### Sun JVM原理与内存管理 #### 一、Sun JDK 1.6 GC (Garbage Collector) Sun JDK 1.6 的垃圾收集器(GC)是其内存管理的关键组成部分,它负责自动地回收不再使用的对象所占用的内存。本文将详细介绍Sun JDK 1.6 GC...
每种算法有不同的特点和适用场景。例如,串行GC适合单核处理器和小规模应用,而并行GC适合多核处理器和大规模应用。选择正确的GC算法对于系统的性能至关重要。 4. 堆大小的调整(heapsize调优) 调整堆内存大小是...
理解JVM垃圾收集器的工作原理和使用场景对于优化Java应用的性能至关重要。选择合适的垃圾收集器配置,结合不同年代的内存管理策略,可以有效避免内存溢出,提高系统响应速度。在面试中,展示对这些知识点的掌握将有...
本资料包包含了对JVM内核原理的详细探讨,以及如何进行诊断和优化的实践指导。 一、JVM内核原理 1. 类加载机制:JVM按照类加载器、双亲委派模型、验证、准备、解析、初始化等步骤加载类。了解这一过程有助于理解类...
### JVM原理、内存模型、性能调优 #### 一、JVM原理概述 Java虚拟机(JVM)是一种用于执行Java字节码的虚拟机。它为Java程序提供了一个独立于平台的运行环境,并且能够自动处理内存管理和垃圾回收等工作。JVM的核心...
Java的执行原理和JVM是Java技术的核心所在。通过Java虚拟机,Java程序实现了跨平台的能力,大大简化了软件的部署和维护工作。同时,JVM的自动内存管理和垃圾回收机制也为开发者提供了便利,使得他们可以更加专注于...
2. **GC算法**:介绍常用的垃圾收集算法,如Serial、Parallel、CMS(Concurrent Mark Sweep)和G1(Garbage-First)等,分析它们的特点和适用场景。 3. **内存区域和大小配置**:讨论堆内存的结构,如Eden区、...
这份文档对于想要深入了解JVM工作原理的读者来说是一份宝贵的学习资料。在这份白皮书中,将从以下几个核心方面展开介绍: 1. 显式与自动内存管理的对比 JVM提供的内存管理机制是自动的,这与其他一些编程语言需要...
《深入JVM内核—原理、诊断、优化视频教程》是一部专为Java开发者设计的深度学习资源,旨在帮助他们理解JVM(Java Virtual Machine)的工作原理,掌握性能诊断技巧,并进行有效的性能优化。该教程通过视频形式,系统...
### Java虚拟机指令集 #### 背景需求 在深入了解Java虚拟机(JVM)指令集之前,读者应具备一定的Java基础知识。...通过深入研究JVM的工作原理和指令集,可以帮助我们更好地理解和优化Java程序的性能。
了解各种GC算法,如标记-清除、复制、标记-整理、分代收集等,以及它们的特点和适用场景,是性能调优的关键。 5. **GC参数** (5.GC参数.pptx) GC参数包括对不同区域的内存大小设定、垃圾收集器的选择、GC日志输出...