----------------------------------------------------------------------------------
作为一种阅读的方式了解下jvm的工作原理
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方法。
相关推荐
Java Virtual Machine (JVM),即Java虚拟机,是一种虚构的计算机,在实际的计算机硬件上仿真模拟出的一套完整的计算机系统,用于执行Java字节码。JVM的设计实现了Java语言“一次编译,到处运行”的核心理念。 **1.2...
对于开发者来说,了解JVM的内部实现有助于优化代码和解决问题。例如,理解JIT(Just-In-Time)编译器的工作原理,可以知道何时Java代码会被编译为本地机器码,从而提升运行效率。 ### 总结 Java虚拟机作为Java技术...
而面向切面编程则提供了一种方式来组织和管理横切关注点,如日志、事务等。Spring框架还包含了对Web应用、数据访问、消息传递、任务调度等多个领域的支持,如Spring MVC、Spring Data、Spring Integration等。 其次...
Java虚拟机(JVM)被定义为一种抽象的计算模型,它不依赖于具体的硬件平台或操作系统,提供了一种统一的运行环境。这意味着JVM可以被视为一种“虚拟”的计算机,其指令集和架构独立于实际的物理机器。书中强调了JVM...
JVM(Java Virtual Machine),即Java虚拟机,是一种用于计算设备的规范,它模拟了一个计算机环境,允许Java程序在这个虚拟环境中运行而无需针对不同平台进行重新编译。这一特性使得Java语言能够实现“一次编写,...
### JVM与Hadoop介绍 #### 一、Java虚拟机(JVM)概述 Java虚拟机(JVM)是执行Java字节码...同时,Hadoop作为一种分布式计算框架,与JVM紧密相连,利用JVM的强大功能处理大规模数据集,是大数据处理领域的关键技术之一。
深入了解JVM对于Java开发者来说至关重要。通过掌握JVM的工作原理和技术细节,开发者不仅能够编写出更加高效、安全的代码,还能更好地解决程序运行过程中出现的问题。随着技术的发展,JVM也在不断地演进和完善,以...
Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java程序提供了运行环境...通过阅读《JVM Specification》,开发者可以深入了解JVM的内部运作,从而编写出更高效、更稳定的Java程序,并能有效地定位和解决问题。
Java作为一种动态性极强的解释型编程语言,在程序运行时,Java虚拟机(JVM)负责将编译生成的`.class`文件加载到内存中进行执行。在Java环境中,每个类(Class)以及接口(Interface)都会对应一个`.class`文件,...
通过实践操作,掌握类的加载、连接与初始化过程,了解不同类型的类加载器及其工作原理,学会创建自定义的类加载器,并对类的卸载有所认识。实验将结合具体的Java程序实例,运用单例模式对静态变量和对象进行初始化,...
总的来说,理解和掌握JVM的工作原理对于Java开发者来说至关重要,它能帮助你编写更高效、更稳定的代码,也能在出现问题时快速定位并解决。通过深入学习"JVM详解-淘宝内部资料"中的内容,你将能够成为一名精通JVM的...
在深入讨论JVM调优之前,我们首先需要了解JVM中数据类型的分类及其存储机制。 ##### 1. 数据类型 Java虚拟机中的数据类型主要分为两类:基本类型和引用类型。 - **基本类型**:包括`byte`, `short`, `int`, `long...
在移动设备和嵌入式系统领域,Windows CE是一个广泛应用的操作系统,而Java作为一种跨平台的语言,其虚拟机(JVM)的实现对于开发者来说至关重要。"jvm.0.4.7-bin.zip"这个压缩包就是专门针对Windows CE平台设计的...
### JAVA文件编译执行与虚拟机(JVM)介绍 #### 关键知识点概述: ...通过对JAVA文件编译、字节码执行及JVM工作原理的深入了解,JAVA程序员能够更好地掌握JAVA编程的核心技术,并有效地解决实际开发中的问题。
3. 双亲委派模型:这是一种类加载机制,确保相同的类只会被加载一次,避免类的冲突。当加载请求发生时,加载器会先让父类加载器尝试加载,只有当父类加载器无法加载时,子类加载器才会尝试。 4. 执行引擎...
- 传统上,JVM通常作为一个单一的进程运行,所有Java程序都在同一个JVM实例中执行。 - 这意味着如果一个Java程序崩溃,可能会导致整个JVM挂掉。 2. **DVM实例**: - DVM允许每个Android应用都在自己的虚拟机实例...
JVM是一种运行Java字节码的虚拟机,它负责垃圾回收、内存管理、类加载以及性能优化等工作。JVM分析器的主要目标是对JVM的内存使用、CPU消耗、线程活动、类加载情况等进行实时监测,以便于定位性能瓶颈和内存泄漏等...
Java虚拟机(JVM)是一种能够执行字节码(.class文件)的虚拟机。它是Java平台的核心部分之一,使得Java应用程序可以在任何支持JVM的平台上运行,而无需考虑底层操作系统的差异性。JVM的主要职责包括: - **加载代码...
JVM调优是优化Java应用程序性能的关键环节,而"jvm-monitor"则提供了一种工具集来帮助开发者监控和分析JVM的状态。本文将深入探讨JVM调优的概念、方法以及如何利用"jvm-monitor"进行有效的监控。 一、JVM调优基础 ...