JVM原理是什么?

作者&投稿:侨胡 (若有异议请与网页底部的电邮联系)
JVM的组成和运行原理是什么?~

JVM是Java Virtual Machine(Java虚拟机)的缩写。
1、JVM的组成:
JVM 由类加载器子系统、运行时数据区、执行引擎以及本地方法接口组成。

2、JVM的运行原理:
JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种基于下层的操作系统和硬件平台并利用软件方法来实现的抽象的计算机,可以在上面执行java的字节码程序。java编译器只需面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译器,编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码,通过特定平台运行。

简单说JVM你可以认为是一套完整的自定义的指令系统,它工作就是完成一种指令的编码和解释工作,如果你想了解的透彻点我推荐你可以读下JVM的源码,或者看些相关虚拟机实现原理的书籍

首先这里澄清两个概念:JVM实例和JVM执行引擎实例,JVM实例对应了一个独立运行的Java程序,而JVM执行引擎实例则对应了属于用户运行程序的线程;也就是JVM实例是进程级别,而执行引擎是线程级别的。JVM是什么?—JVM的生命周期JVM实例的诞生:当启动一个Java程序时,一个JVM实例就产生了,任何一个拥有publicstaticvoidmain(String[]args)函数的class都可以作为JVM实例运行的起点,既然如此,那么JVM如何知道是运行classA的main而不是运行classB的main呢?这就需要显式的告诉JVM类名,也就是我们平时运行Java程序命令的由来,如JavaclassAhelloworld,这里Java是告诉os运行SunJava2SDK的Java虚拟机,而classA则指出了运行JVM所需要的类名。JVM实例的运行:main()作为该程序初始线程的起点,任何其他线程均由该线程启动。JVM内部有两种线程:守护线程和非守护线程,main()属于非守护线程,守护线程通常由JVM自己使用,Java程序也可以标明自己创建的线程是守护线程。JVM实例的消亡:当程序中的所有非守护线程都终止时,JVM才退出;若安全管理器允许,程序也可以使用Runtime类或者System.exit()来退出。JVM是什么?—JVM的体系结构粗略分来,JVM的内部体系结构分为三部分,分别是:类装载器(ClassLoader)子系统,运行时数据区,和执行引擎。下面将先介绍类装载器,然后是执行引擎,最后是运行时数据区1、类装载器,顾名思义,就是用来装载.class文件的。JVM的两种类装载器包括:启动类装载器和用户自定义类装载器,启动类装载器是JVM实现的一部分,用户自定义类装载器则是Java程序的一部分,必须是ClassLoader类的子类。(下面所述情况是针对SunJDK1.2)动类装载器:只在系统类(JavaAPI的类文件)的安装路径查找要装入的类用户自定义类装载器:系统类装载器:在JVM启动时创建,用来在CLASSPATH目录下查找要装入的类其他用户自定义类装载器:这里有必要先说一下ClassLoader类的几个方法,了解它们对于了解自定义类装载器如何装载.class文件至关重要。protectedfinalClassdefineClass(Stringname,bytedata[],intoffset,intlength) protectedfinalClassdefineClass(Stringname,bytedata[],intoffset,intlength,ProtectionDomainprotectionDomain);protectedfinalClassfindSystemClass(Stringname) protectedfinalvoidresolveClass(Classc) defineClass用来将二进制class文件(新类型)导入到方法区,也就是这里指的类是用户自定义的类(也就是负责装载类)findSystemClass通过类型的全限定名,先通过系统类装载器或者启动类装载器来装载,并返回Class对象。ResolveClass:让类装载器进行连接动作(包括验证,分配内存初始化,将类型中的符号引用解析为直接引用),这里涉及到Java命名空间的问题,JVM保证被一个类装载器装载的类所引用的所有类都被这个类装载器装载,同一个类装载器装载的类之间可以相互访问,但是不同类装载器装载的类看不见对方,从而实现了有效的屏蔽。2、执行引擎:它或者在执行字节码,或者执行本地方法要说执行引擎,就不得不的指令集,每一条指令包含一个单字节的操作码,后面跟0个或者多个操作数。(一)指令集以栈为设计中心,而非以寄存器为中心这种指令集设计如何满足Java体系的要求:平台无关性:以栈为中心使得在只有很少register的机器上实现Java更便利compiler一般采用stack向连接优化器传递编译的中间结果,若指令集以stack为基础,则有利于运行时进行的优化工作与执行即时编译或者自适应优化的执行引擎结合,通俗的说就是使编译和运行用的数据结构统一,更有利于优化的开展。网络移动性:class文件的紧凑性。安全性:指令集中绝大部分操作码都指明了操作的类型。(在装载的时候使用数据流分析期进行一次性验证,而非在执行每条指令的时候进行验证,有利于提高执行速度)。(二)执行技术主要的执行技术有:解释,即时编译,自适应优化、芯片级直接执行其中解释属于第一代JVM,即时编译JIT属于第二代JVM,自适应优化(目前Sun的HotspotJVM采用这种技术)则吸取第一代JVM和第二代JVM的经验,采用两者结合的方式自适应优化:开始对所有的代码都采取解释执行的方式,并监视代码执行情况,然后对那些经常调用的方法启动一个后台线程,将其编译为本地代码,并进行仔细优化。若方法不再频繁使用,则取消编译过的代码,仍对其进行解释执行。3、运行时数据区:主要包括:方法区,堆,Java栈,PC寄存器,本地方法栈(1)方法区和堆由所有线程共享堆:存放所有程序在运行时创建的对象方法区:当JVM的类装载器加载.class文件,并进行解析,把解析的类型信息放入方法区。(2)Java栈和PC寄存器由线程独享,在新线程创建时间里(3)本地方法栈:存储本地方法调用的状态上边总体介绍了运行时数据区的主要内容,下边进行详细介绍,要介绍数据区,就不得不说明JVM中的数据类型。JVM中的数据类型:JVM中基本的数据单元是word,而word的长度由JVM具体的实现者来决定数据类型包括基本类型和引用类型,(1)基本类型包括:数值类型(包括除boolean外的所有的Java基本数据类型),boolean(在JVM中使用int来表示,0表示false,其他int值均表示true)和returnAddress(JVM的内部类型,用来实现finally子句)。(2)引用类型包括:数组类型,类类型,接口类型前边讲述了JVM中数据的表示,下面让我们输入到JVM的数据区首先来看方法区:上边已经提到,方法区主要用来存储JVM从class文件中提取的类型信息,那么类型信息是如何存储的呢?众所周知,Java使用的是大端序(big?endian:即低字节的数据存储在高位内存上,如对于1234,12是高位数据,34为低位数据,则Java中的存储格式应该为12存在内存的低地址,34存在内存的高地址,x86中的存储格式与之相反)来存储数据,这实际上是在class文件中数据的存储格式,但是当数据倒入到方法区中时,JVM可以以任何方式来存储它。类型信息:包括class的全限定名,class的直接父类,类类型还是接口类型,类的修饰符(public,等),所有直接父接口的列表,Class对象提供了访问这些信息的窗口(可通过Class.forName(“”)或instance.getClass()获得),下面是Class的方法,相信大家看了会恍然大悟,(原来如此J)getName(),getSuperClass(),isInterface(),getInterfaces(),getClassLoader();static变量作为类型信息的一部分保存指向ClassLoader类的引用:在动态连接时装载该类中引用的其他类指向Class类的引用:必然的,上边已述该类型的常量池:包括直接常量(String,integer和floatpoint常量)以及对其他类型、字段和方法的符号引用(注意:这里的常量池并不是普通意义上的存储常量的地方,这些符号引用可能是我们在编程中所接触到的变量),由于这些符号引用,使得常量池成为Java程序动态连接中至关重要的部分字段信息:普通意义上的类型中声明的字段方法信息:类型中各个方法的信息编译期常量:指用final声明或者用编译时已知的值初始化的类变量class将所有的常量复制至其常量池或者其字节码流中。方法表:一个数组,包括所有它的实例可能调用的实例方法的直接引用(包括从父类中继承来的)除此之外,若某个类不是抽象和本地的,还要保存方法的字节码,操作数栈和该方法的栈帧,异常表。举例:classLava{ privateintspeed=5; voidflow(){} classVolcano{ publicstaticvoidmain(String[]args){ Lavalava=newLava(); lava.flow(); } } 运行命令JavaVolcano;(1)JVM找到Volcano.class倒入,并提取相应的类型信息到方法区。通过执行方法区中的字节码,JVM执行main()方法,(执行时会一直保存指向Vocano类的常量池的指针)(2)Main()中第一条指令告诉JVM需为列在常量池第一项的类分配内存(此处再次说明了常量池并非只存储常量信息),然后JVM找到常量池的第一项,发现是对Lava类的符号引用,则检查方法区,看Lava类是否装载,结果是还未装载,则查找“Lava.class”,将类型信息写入方法区,并将方法区Lava类信息的指针来替换Volcano原常量池中的符号引用,即用直接引用来替换符号引用。(3)JVM看到new关键字,准备为Lava分配内存,根据Volcano的常量池的第一项找到Lava在方法区的位置,并分析需要多少对空间,确定后,在堆上分配空间,并将speed变量初始为0,并将lava对象的引用压到栈中(4)调用lava的flow()方法好了,大致了解了方法区的内容后,让我们来看看堆Java对象的堆实现:Java对象主要由实例变量(包括自己所属的类和其父类声明的)以及指向方法区中类数据的指针,指向方法表的指针,对象锁(非必需),等待集合(非必需),GC相关的数据(非必需)(主要视GC算法而定,如对于标记并清除算法,需要标记对象是否被引用,以及是否已调用finalize()方法)。那么为什么Java对象中要有指向类数据的指针呢?我们从几个方面来考虑首先:当程序中将一个对象引用转为另一个类型时,如何检查转换是否允许?需用到类数据其次:动态绑定时,并不是需要引用类型,而是需要运行时类型,这里的迷惑是:为什么类数据中保存的是实际类型,而非引用类型?这个问题先留下来,我想在后续的读书笔记中应该能明白指向方法表的指针:这里和C++的VTBL是类似的,有利于提高方法调用的效率对象锁:用来实现多个线程对共享数据的互斥访问等待集合:用来让多个线程为完成共同目标而协调功过。(注意Object类中的wait(),notify(),notifyAll()方法)。Java数组的堆实现:数组也拥有一个和他们的类相关联的Class实例,具有相同dimension和type的数组是同一个类的实例。数组类名的表示:如[[LJava/lang/Object表示Object[][],[I表示int[],[[[B表示byte[][][]至此,堆已大致介绍完毕,下面来介绍程序计数器和Java栈程序计数器:为每个线程独有,在线程启动时创建,若thread执行Java方法,则PC保存下一条执行指令的地址。若thread执行native方法,则Pc的值为undefinedJava栈:Java栈以帧为单位保存线程的运行状态,Java栈只有两种操作,帧的压栈和出栈。每个帧代表一个方法,Java方法有两种返回方式,return和抛出异常,两种方式都会导致该方法对应的帧出栈和释放内存。帧的组成:局部变量区(包括方法参数和局部变量,对于instance方法,还要首先保存this类型,其中方法参数按照声明顺序严格放置,局部变量可以任意放置),操作数栈,帧数据区(用来帮助支持常量池的解析,正常方法返回和异常处理)。本地方法栈:依赖于本地方法的实现,如某个JVM实现的本地方法借口使用C连接模型,则本地方法栈就是C栈,可以说某线程在调用本地方法时,就进入了一个不受JVM限制的领域,也就是JVM可以利用本地方法来动态扩展本身。相信大家都明白JVM是什么了吧。原文链接: http://www.cnblogs.com/chenzhao/archive/2011/08/14/2137713.html

JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境.
1.创建JVM装载环境和配置
2.装载JVM.dll
3.初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例
4.调用JNIEnv实例装载并处理class类。

简单说JVM你可以认为是一套完整的自定义的指令系统,它工作就是完成一种指令的编码和解释工作,如果你想了解的透彻点我推荐你可以读下JVM的源码,或者看些相关虚拟机实现原理的书籍

咕泡学院 James讲JVM看了就知道,百度搜索 咕泡学院


求教vmware上网原理,能否不用真机网卡驱动,直接使用虚拟机上网_百度知 ...
1、桥接:就是把虚拟机通过VMnet0桥接到主机的本地连接。现在虚拟机是通过VMnet0与外界联系,现在的虚拟机就相当于和主机一样是物理网络中的一台电脑,说的通俗的就是现在虚拟机就相当于和你主机同在一个网络的另一台真实的电脑。所以要想使用桥接使虚拟机上网,前提必须你的主机处在局域网中,也就...

高效液相的原理,最好详细点
式中,cs—溶质在固定相中浓度;cm--溶质在流动相中的浓度; Vs—固定相的体积;Vm—流动相的体积。LLPC与GPC有相似之处,即分离的顺序取决于K,K大的组分保留值大;但也有不同之处,GPC中,流动相对K影响不大,LLPC流动相对K影响较大。 a. 正相液 — 液分配色谱法(Normal Phase liquid Chromatography): 流动...

QVM人工智能引擎的原理分析
千万不要被名字中的VM迷惑,以为是Virtual Machine(虚拟机)。 实质这个VM是support vector machine(支持向量机)的缩写。其具体理论细节可以参见Vapnik著作的机器学习经典Statistical Learning Theory。从上述可以看出,这类技术有明显的优点:1、只要算法得当,完全可以自我学习,减少的人力成本。2、对病毒的...

能说说vue的响应式原理吗?
Vue 是一个 MVVM 框架,核心是双向数据绑定,VM(视图模型)是作为 V(视图) 和 M(模型)的桥梁。下面是对 Vue 响应式(双向数据绑定)的理解,如果错误尽请指出,一起交流,共同进步。Vue响应式原理核心是 数据劫持,采用 ES5 的 object.defineproperty 的 getter 和 setter 方法。从一个例子出发...

高效液相的原理,最好详细点
2018-01-09 高效液相色谱原理是什么? 2011-10-26 高效液相色谱原理 131 2011-08-10 高效液相色谱法的原理 111 2012-05-24 高效液相色谱仪的基本工作原理 7 2012-05-05 高效液相色谱分析法的原理是什么? 5 2013-11-19 高效液相色谱仪器原理是什么? 2 2011-11-04 高效液相色谱仪的使用和原理分析 ...

锂电池保护板的作用是什么?
在保护板正常的情况下,Vdd为高电平,Vss,VM为低电平,DO、CO为高电平,当Vdd,Vss,VM任何一项参数变换时,DO或CO端的电平将发生变化。 锂电池保护板原理 锂电池(可充型)之所以需要保护,是由它本身特性决定的。由于锂电池本身的材料决定了它不能被过充、过放、过流、短路及超高温充放电,因此锂电池锂电组件总会跟...

美国虚拟主机的技术原理
美国虚拟主机是通过美国虚拟主机 ware Server虚拟化技术实现的虚拟服务器,虚拟化是一个抽象层,它将物理硬件与操作系统分开,从而提供更高的 IT 资源利用率和灵活性。美国虚拟主机是一项服务器虚拟化和自动化技术,它采用的是操作系统虚拟化技术。操作系统虚拟化的概念是基于共用操作系统内核,这样虚拟服务...

太阳能电池的工作原理
原理:太阳光照在半导体p-n结上,形成新的空穴-电子对,在p-n结内建电场的作用下,光生空穴流向p区,光生电子流向n区,接通电路后就产生电流。这就是光电效应太阳能电池的工作原理。太阳能发电有两种方式,一种是光—热—电转换方式,另一种是光—电直接转换方式。光—热—电转换:光—热—电...

详解JVM工作原理和特点
首先来说一下JVM工作原理中的jdk这个东西 不管你是初学者还是高手 是j ee程序员还是j se程序员 jdk总是在帮我们做一些事情 我们在了解Java之前首先大师们会给我们提供说jdk这个东西 它在Java整个体系中充当着什么角色呢?我很惊叹sun大师们设计天才 能把一个如此完整的体系结构化的如此完美 jdk在这个...

太阳能的工作原理是什么?
其中:Isc--短路电流, Voc--开路电压, Im--最佳工作电流, Vm--最佳工作电压; d)标准光强与环境温度 地面:AM1.5光谱,1000W\/m2,t=25℃; e)温度对电池性质的影响 。 例如:在标准状况下,AM1.5光强, t=25℃ 某电池板输出功率测得为100Wp,如果电池温度升高至45℃时,则电池板输出...

塔城地区18990413254: JVM原理是什么? -
宿健迪可: JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境. 1.创建JVM装载环境和配置 2.装载JVM.dll 3.初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例 4.调用JNIEnv实例装载并处理class类.

塔城地区18990413254: 什么是JVM?Java跨平台的原理是什么? -
宿健迪可: 首先我们要理解什么是跨平台,所谓的跨平台就是JAVA写的一份代码可以在任意的操作系统平台上运行.为什么跨平台会成为一个问题呢?因为每一个操作系统平台支持不同的指令集我们所写的代码经过编译之后只能适用于一个平台,换一个...

塔城地区18990413254: java虚拟机原理 -
宿健迪可: JVM 的原理就是把写哈的java代码转化为机器可以识别的binary 代码.然后再由compiler 去编译binary代码. 这也就是为什么java是平台无关的原理了.其他的编译环境都是把程序代码转化为编译代码直接编译,这样机器底层就不能识别这些代码,所以不能跨平台操作.而jvm虽然在表面上走了远路,但是这样却省去了不少的麻烦,也省了不少的内存占有.

塔城地区18990413254: java虚拟机是用来做什么的?怎么用? -
宿健迪可: 1,什么是Java虚拟机 Java虚拟机(JVM)是Java Virtual Machine的缩写,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能模拟来实现的.Java虚拟机有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有...

塔城地区18990413254: Java虚拟机类装载原理是什么呢?
宿健迪可: Java虚拟机(JVM)的类装载就是指将包含在类文件中的字节码装载到JVM中, 并使其成为JVM一部分的过程.JVM的类动态装载技术能够在运行时刻动态地加载或者替换系统的某些功能模块, 而不影响系统其他功能模块的正常运行. 本文将分析JVM中的类装载系统,探讨JVM中类装载的原理、实现以及应用.

塔城地区18990413254: jvm是什么意思? -
宿健迪可: Java Virtual Machine(Java虚拟机),它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的,.Java虚拟机有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统.JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行.Java虚拟机在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行.

塔城地区18990413254: jvm是什么? -
宿健迪可: 是java虚拟机,一方面是在编辑完.java源程序后,再编译成.class二进制文件,最终启动jvm解释并执行,在main主线程中进行;另一方面在GC(垃圾回收)机制中,同样也是用到jvm,java虚拟机.

塔城地区18990413254: jvm是如何实现的
宿健迪可: 编程语言和自然语言类似,都是为了交流,自然语言用于跟人交流,程序语言则用于指示机器. jvm其实也就是一个程序,这个程序能接受你的Java代码,然后根据你的意愿执行一系列操作. 举个例子,你可以写一个这样的程序,这个程序接受...

塔城地区18990413254: java虚拟机工作原理? -
宿健迪可: 环境变量设置好classpath和path. classpath是指JVM将要加载的类文件的路径,path指JVM的工具箱的路径 当JVM加载类时,系统会给虚拟机分配一个数据内存区,在这个内存区中,又分为三个小内存区. 堆区是存放这个类的对象的;方法区是存放类的类型信息,包括类的静态变量和方法.栈区是存放局部变量的. 当加载类时,JVM会先把类的类型信息全部存放到方法区,加载完后,定位到方法区中的main方法,开始执行指令.

塔城地区18990413254: 你知道java的运行原理是什么吗 -
宿健迪可: Java这一语言的执行过程也遵循这样的过程:源代码--->机器码. 但是,从源代码到机器码之间,究竟经过什么样的过程,则是Java独一无二的了.宽泛地讲,Java源代码(.java)经过java编译器(javac.exe)编译之后,并没有直接转化为机器...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网