作为一种阅读的方式了解下jvm的工作原理

ps:(一些二逼的逼神面试官会问的问题)

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这些东西,这两个东西目的非常easy,分别用来简化各自领域内的开发和构建过程.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文件.装入工作非常easy就是调用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工作原理和特点(一些二逼的逼神面试官会问的问题)的更多相关文章

  1. 一篇笔记整理JVM工作原理

    首先要了解的 >>数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型. 基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值.“引用值”代表了 ...

  2. JVM工作原理

    作为一种阅读的方式了解下jvm的工作原理 JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境. 1.创建JVM装载环境和配置 2.装载JV ...

  3. 一篇笔记带你梳理JVM工作原理

    首先要了解的 数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型. 基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值.“引用值”代表了某个对象的引用, ...

  4. 详解JVM工作原理和特点

    在我们运行和调试Java程序的时候,经常会提到一个JVM的概念.本文将为大家讲解JVM工作原理和特点,希望对大家有所帮助. AD:网+线下沙龙 | 移动APP模式创新:给你一个做APP的理由>& ...

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

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

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

    JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境. 1.创建JVM装载环境和配置 2.装载JVM.dll 3.初始化JVM.dll并挂界 ...

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

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

  8. 面试官再问你 HashMap 底层原理,就把这篇文章甩给他看

    前言 HashMap 源码和底层原理在现在面试中是必问的.因此,我们非常有必要搞清楚它的底层实现和思想,才能在面试中对答如流,跟面试官大战三百回合.文章较长,介绍了很多原理性的问题,希望对你有所帮助~ ...

  9. 【基础】工作中常用的linux命令,经常会被面试官问到

    前言 面试经常会问到一些Linux操作命令,下面就工作中常用的和面试问的频率较高的命令做详细描述. 常用命令 修改密码:passwd 用户名 切换用户名:su 用户名 查看当前路径:pwd 调整路径: ...

随机推荐

  1. 连数据库是ODBC好还是OLEDB好

    1.连数据库是ODBC好还是OLEDB好?2.是不是只有微软的数据库才可以用OLEDB?3.要切换这两种连接,是不是只需要修改连接字符串?谢谢大家了,小弟对这三个问题不解 分享到:   2009-03 ...

  2. vue-router 快速入门

    ue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用.vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来.传统的页面应用 ...

  3. ueditor富文本编辑的使用方法

    平时在编写上传文件,图片,视频等等这些功能的代码会很繁琐,这里我介绍一款由百度推出的CuteEditor,是一款功能非常强大,支持图片上传.文件下载和word类似的文字编辑器.对于新闻发布系统和博客之 ...

  4. PIL库 (Pillow)

    PIL基础 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important ...

  5. Visual Studio 2013 Web开发、新增功能:“Browser Link”

    微软正式发布Visual Studio 2013 RTM版,微软还发布了Visual Studio 2013的最终版本..NET 4.5.1以及Team Foundation Server 2013. ...

  6. iOS 面试题 2

    1.         描述应用程序的启动顺序. 1.程序入口main函数创建UIApplication实例和UIApplication代理实例 2.在UIApplication代理实例中重写启动方法, ...

  7. OpenCV——写手势识别碰到的各种错误

    最近写opencv的手势识别时,真的碰到了好多好多程序运行时的错误. 比如: 位置冲突: findcontours函数的使用错误: 各种符号的加载错误: 这种符号加载的错误,一般用网上各种方法就可以解 ...

  8. Gengxin讲STL系列——Queue和Stack

    第三篇. 感觉队列和栈是必须的……所以决定加上这两个…… 我发现我已经买域名买上隐了……今天又买了个.top……真是智障…… Queue(队列FIFO)和Statk(栈LIFO). 那么为什么要这两个 ...

  9. 控制点:ControlPoint

    位于control:Points面板下,kitControl面板的ControlPallette中也存在控制点. 控制点是什么呢?一个数据值.一个传感器的值.比如,温度值,风速值,压力值,光照值,开关 ...

  10. python单元测试--深入理解unittest

    单元测试的重要性就不多说了,可恶的是python中有太多的单元测试框架和工具,什么unittest, testtools, subunit, coverage, testrepository, nos ...