作为一种阅读的方式了解下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. pyqt说明

    我是个PHP程序员,不过有时候觉得需要写些小软件,对于我这种不太熟悉桌面软件开发的人来说,界面问题最让我头痛.听说Qt很强大,而且是跨平台,所以决定学习它用来弥补我写桌面软件的不足. Qt一般是通过C ...

  2. 链表list容器中通过splice合并链表与merge的不同,及需要注意的问题

    #include "stdafx.h" #include <iostream> #include <list> #include <algorithm ...

  3. fragment的入门DEMO

    效果图: 代码如下: 1.main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLay ...

  4. [Cycle.js] From toy DOM Driver to real DOM Driver

    This lessons shows how we are able to easily swap our toy DOM Driver with the actual Cycle.js DOM Dr ...

  5. 改动mac环境变量,并配置gradle

    由于项目中要用到gradle命令,可是没有配置环境变量.这里记录一下解决过程. 过程例如以下: 1. 启动终端Terminal 2. 进入当前用户的home文件夹 输入cd ~ 3. 创建.bash_ ...

  6. php + apache + mysql

    http://archive.apache.org/dist/httpd/binaries/win32/   Apache msi 下载地址

  7. UIAlertController(警告栏) 自学之初体验

    UIAlertController有两种样式  preferredStyle: UIAlertControllerStyleAlert (位于屏幕的中部) UIAlertControllerStyle ...

  8. python 3.6 import pymysql错误

    在3.x之后可以用pymysql来代替之前的mysqldb模块. 首先安装pip: 终端命令: easy_install pip 随后成功安装pip 继续输入命令 pipinstall PyMySQL ...

  9. 关于char/varchar(n)中n的探究:字符数or字节数

    [问题来源]将设计的数据库表展示的时候,yu哥问我,你的那个top_info字段定义的类型是varchar(100),为什么是100呢,这100的长度能存多少个中文? 当时的想法就是,这个100能存多 ...

  10. ElasticSearch入门知识扫盲

    ElasticSearch 入门介绍 tags: 第三方 lucene [toc] 1. what Elastic Search(ES)是什么 全文检索和lucene 全文检索 优点:高效,准确,分词 ...