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环境.
1.创建jvm装载环境和配置
2.装载jvm.dll
3.初始化jvm.dll并挂界到JNIENV(JNI调用接口)实例
4.调用JNIEnv实例装载并处理class类。
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.主要的内容如下:
-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变量的CreateJavaVMGetDefaultJavaVMInitArgs函数指针变量上。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的运行过程
相关推荐
常用jvm参数都在这张图中,参考起来方便,是国外大神整理的
- **JDK**和**JRE**都包含了**JVM**,使得Java程序能够在不同的环境中运行。 - **JVM**是Java的核心,负责字节码的执行。 3. **即时编译器(JIT)**: - **JIT**是**JVM**的一部分,它的主要作用是在运行时将字节...
这一机制负责将Java类文件加载到JVM中,使得程序能够运行。下面我们将详细探讨这一机制。 **1.1 什么是classloader?** classloader,即类加载器,是JVM的一部分,负责将编译后的Java字节码文件(.class文件)加载...
Java虚拟机(JVM)是Java程序运行的核心组件,它负责解释和执行字节码,为Java应用程序提供了一个跨平台的运行环境。《JAVA8虚拟机(jvm)规范_Chinese version》提供了关于JVM的详细中文指南,对于理解Java程序的运行...
JDK(Java Development Kit)包含了开发和运行Java程序所需的所有工具,包括JVM。当我们谈论"jdk,jvm源码"时,我们主要关注的是JVM的内部工作机制以及如何通过源码来理解这个过程。 JVM的运行机制主要包括以下几个...
Java 1.6 JDK 是Java开发工具包的一个版本,它为开发者提供了编译、调试和运行Java应用程序所需的所有工具。这个版本特别强调了对中文的支持,使得中文用户在使用过程中可以更加顺畅地阅读文档和理解API。JDK是Java ...
Java开发中的JDK、JRE和JVM是三个至关重要的概念,它们构成了Java应用程序的运行基础。理解这三个术语以及它们之间的关系是每个Java开发者必备的知识。 JDK(Java Development Kit)是Java开发工具包,它是Java开发...
在Java编程的世界里,JDK(Java Development Kit)、JRE(Java Runtime Environment)和JVM(Java Virtual Machine)这三个核心概念是不可或缺的基础知识。无论是对于初学者还是资深开发者而言,深入理解这三者之间...
JDK和JVM以及线程储存方面
这个"java8 jdk1.8免安装包"是一个方便的版本,用户无需进行传统的安装过程,只需解压文件到指定位置,即可开始使用Java开发和运行环境。 首先,我们来详细了解一下JDK(Java Development Kit)。JDK是Java程序员...
Java JDK包含了许多组件,其中最重要的是Java编译器(javac)、Java解释器(java)、Java虚拟机(JVM)以及Java类库,这些使得开发者能够编写、编译、调试和运行Java应用程序。 1. **Java编译器** (javac): 它将源...
JRE(Java Runtime Environment)是运行Java应用程序所必需的环境,它包含了JVM以及运行Java应用程序所需的库文件和其他资源。JRE的主要组成部分包括: 1. **JVM**:如前所述,JVM是JRE的核心组件,负责执行Java...
Java JDK 1.5.0 安装和设置指南 Java 是一种流行的编程语言,它广泛应用于 Android 应用程序、Web 应用程序和桌面应用程序等领域。为了使用 Java开发应用程序,需要安装 Java 开发工具包(JDK),本文将指导您安装...
JDK 是开发和运行 Java 应用程序所需的一组工具和库的集合,包括 JRE(Java Runtime Environment)和开发工具。 JVM(Java Virtual Machine)是 JDK 的核心组成部分,它负责执行字节码,提供了一个“一次编写,到处...
JDK(Java Development Kit)包含了开发和运行Java应用程序所需的所有工具和库,包括Java虚拟机(JVM)、编译器(javac)、类库以及调试器(jdb)等。这个版本的编号为8u202,"u"代表更新(update),意味着它是Java...
JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。 jdk1.8新特性 1)Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可。 2)新增lambda表达式 3)提供...
在Java JDK中,最重要的组件是Java编译器(javac)、Java虚拟机(JVM)和Java类库。首先,让我们深入了解这些核心组成部分: 1. **Java编译器(javac)**:它是Java程序从源代码到字节码转换的关键工具。当你编写完`....
首先,Java JDK是开发和运行Java应用程序所需的核心组件,包括Java编译器(javac)、Java虚拟机(JVM)以及各种工具,如Java运行时环境(JRE)的一部分。JRE是运行Java程序所必需的,而JDK则是开发Java程序的工具集...
Java类库是JDK和JRE中的重要组成部分,它包含了大量预定义的类和接口,供开发者在编写Java程序时使用。这些类库涵盖了网络通信、多线程、I/O操作、数据库连接、图形用户界面等多种功能,极大地简化了开发过程。 总...