首页 > 5g > 正文

java虚拟机是什么 ?java虚拟机包含哪些部分?java虚拟机运行原理

2022-06-06 13:45:44来源:迪族网  

虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java 虚拟机屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 Java 虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

java虚拟机是什么

Java 虚拟机(Java Virtual Machine 简称JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,它是 Java 最具吸引力的特性之一。

java虚拟机包含哪些部分

程序计数器

程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,可以理解为是当前线程的行号指示器。字节码解释器在工作时,会通过改变这个计数器的值来取下一条语句指令。

虚拟机栈

一个线程的每个方法在执行的同时,都会创建一个栈帧(Statck Frame),栈帧中存储的有局部变量表、操作站、动态链接、方法出口等, 当方法被调用时,栈帧在JVM栈中入栈,当方法执行完成时,栈帧出栈。

局部变量表中存储着方法的相关局部变量,包括各种基本数据类型,对象的引用,返回地址等。

虚拟机栈中定义了两种异常,如果线程调用的栈深度大于虚拟机允许的最大深度,则抛出StatckOverFlowError(栈溢出);

不过多数Java虚拟机都允许动态扩展虚拟机栈的大小(有少部分是固定长度的),所以线程可以一直申请栈,直到内存不足,此时,会抛出OutOfMemoryError(内存溢出)。

本地方法栈

本地方法栈在作用,运行机制,异常类型等方面都与虚拟机栈相同,唯一的区别是:虚拟机栈是执行Java方法的,而本地方法栈是用来执行native方法的,在很多虚拟机中(如Sun的JDK默认的HotSpot虚拟机),会将本地方法栈与虚拟机栈放在一起使用。

堆区

在JVM所管理的内存中,堆区是最大的一块,堆区也是Java GC机制所管理的主要内存区域,堆区由所有线程共享,在虚拟机启动时创建。

堆区的存在是为了存储对象实例,原则上讲,所有的对象都在堆区上分配内存(不过现代技术里,也不是这么绝对的,也有栈上直接分配的)。

方法区

方法区是各个线程共享的区域,用于存储已经被虚拟机加载的类信息(即加载类时需要加载的信息,包括版本、field、方法、接口等信息)、final常量、静态变量、编译器即时编译的代码等。

直接内存

直接内存并不是JVM管理的内存,可以这样理解,直接内存,就是JVM以外的机器内存。

比如,你有4G的内存,JVM占用了1G,则其余的3G就是直接内存,JDK中有一种基于通道(Channel)和缓冲区(Buffer)的内存分配方式,将由C语言实现的native函数库分配在直接内存中,用存储在JVM堆中的DirectByteBuffer来引用。

由于直接内存收到本机器内存的限制,所以也可能出现OutOfMemoryError的异常。

java虚拟机运行原理

在java虚拟机中,程序员编译之后的class文件其实是作为Java虚拟机中的质料被输入到Java虚拟机的内部的,那么,具体会由谁来做这一部分工作呢?类加载器!Java虚拟机的内部有着一个叫做类加载器的子系统,这个子系统会用来在程序运行时根据需要加载类。注意:是“根据需要”。Java虚拟机执行过程中,只有在它需要一个类的时候,它才会调用类加载器来加载这个类,而并不是在开始运行时就加载所有的类。举个例子:就像你吃饭一样,你只有在饿的时候才会去吃饭,总不能一次把一辈子的饭都吃完,然后接下来一辈子都不吃饭了吧。所以,一般来说,虚拟机加载类的时机,就是在第一次使用一个新的类的时候。

Java中由虚拟机加载的类,在被加载到Java虚拟机内存中之后,虚拟机就会读取并执行它内存里存在的字节码指令。虚拟机中执行字节码指令的部分被叫做执行引擎。唔,大概就像你吃饭,吃完饭总要消化的,不能一直吃下去,执行引擎就相当于人的胃一样。java虚拟机在执行过程中还会把各个class文件动态的连接起来。

责任编辑:hnmd003

相关阅读

相关阅读

推荐阅读