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.主要的内容如下:

  1. -client KNOWN
  2. -server KNOWN
  3. -hotspot ALIASED_TO -client
  4. -classic WARN
  5. -native ERROR
  6. -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工作原理和特点相关推荐

  1. java的两种运行机制_Java☞JVM工作原理

    参考博客:1 2 3 JVM工作原理 java虚拟机体系结构 Java平台由Java虚拟机和Java应用程序接口搭建,Java语言则是进入这个平台的通道,用Java语言编写并编译的程序可以运行在这个平 ...

  2. JVM 工作原理和即时编译(JIT)

    目录 1.什么是虚拟机? 2.JVM 虚拟机简介 3.JVM 的工作原理 4.什么是即时编译(JIT)? 5.解释型语言和编译型语言的区别 6.为什么说 Java 是一种半编译半解释的语言? 1.什么 ...

  3. 面试挂在JVM?别慌,图文讲解JVM工作原理,看完还不懂我跪键盘

    本文转载自:面试挂在JVM?别慌,图文讲解JVM工作原理,看完还不懂我跪键盘 JDK,JRE,JVM的联系是啥? JVM Java Virtual Machine JDK Java Developme ...

  4. JVM 工作原理和流程

    转 Java 详解 JVM 工作原理和流程 <div class="article-info-box"><div class="article-bar- ...

  5. Java 内存管理、JVM 工作原理与 Java 运行时系统

    Java 虚拟机规范中说明:所有的对象实例(all class instances)以及数组都要在堆上分配: the heap is the runtime data area from which ...

  6. Java 详解 JVM 工作原理和流程

    2019独角兽企业重金招聘Python工程师标准>>> 作为一名Java使用者,掌握JVM的体系结构也是必须的. 说起Java,人们首先想到的是Java编程语言,然而事实上,Java ...

  7. java开发流程图_Java 详解 JVM 工作原理和流程

    作为一名Java使用者,掌握JVM的体系结构也是必须的. 说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Java编程语言.Java类文件格式.Java ...

  8. JAVA虚拟机JVM工作原理

    提起JAVA,都知道它有个虚拟机,因此可以跨平台,一次编写,到处运行.但具体原理是咋样的?身为JAVA小白,岂可不知! 一.原理 二.结构 1.类加载器 2.执行引擎 3.运行时数据区域 一.原理 J ...

  9. Jvm工作原理学习笔记(转)

    2019独角兽企业重金招聘Python工程师标准>>> 一.         JVM的生命周期 1.       JVM实例对应了一个独立运行的java程序它是进程级别 a)     ...

最新文章

  1. 万字长文揭穿你,根本就不懂云原生!
  2. intellij中springboot热部署
  3. oracle asm 日志,Oracle+RAC+ASM数据库ora-00257日志归档器错误解决方法
  4. gorm preload 搜索_macOS系统本地文件搜索工具
  5. 计算机专业迎新标语,迎新 || 标题不要了,只要你
  6. 组态王 6.55 启停plc_永宏PLC在远程控制系统中的应用
  7. 015_ICMP专项研究监控
  8. liunx下搭建mysql主从_linux下搭建mysql主从
  9. 实现python扩展的C API方法过程全纪录(windows)
  10. SpringMVC控制类的Controller方法返回值
  11. 3步接入顺丰快递云打印电子面单接口API
  12. 试图速成的RPG Maker MV 学习笔记(二)
  13. 这几招教你如何增加食物中铁的吸收
  14. 使Celery 4在Windows上运行的2种方法
  15. OpenWrt一些小问题的解决方法
  16. python计算点到面的距离
  17. MySQL新增数据,存在就更新,不存在就添加(Mybatis)
  18. Linux 2.6 劫持系统调用 隐藏进程
  19. 一文让你彻底了解EMC防护器件之TVS
  20. 新零售时代,门店收银系统选择windows还是安卓?

热门文章

  1. 如何移植.NET Framework项目至.NET Core?
  2. 基于struts2+hibernate+spring(ssh2)的登录验证码的实现
  3. 如何在运行时确定对象类型(RTTI)
  4. 获取某年某月的第一天和最后一天的Sql Server函数
  5. vue/cli 3.0 font-size随屏幕大小变化而变化 rem设置
  6. springMvc json 参数
  7. 【GIT 基础篇二】创建版本库与提交
  8. 免 sudo 使用 docker
  9. UIButton标题和图片位置的确定法则
  10. 项目忙还要过软考,您需要简练!