JVM初识

JVM是Java编译器和OS之间的模拟处理器。代码程序面向虚拟机,只需生成虚拟机可以识别的代码,然后由解释器将其转换为特定系统的机器码执行。

JVM提供的方式是操作系统的动态连接库,所以需要有程序路径path,path路径主要是用来寻找到程序运行所需要的类库。

虚拟机可理解的代码叫做字节码。字节码是JVM可以识别和执行的指令,它是一个二进制的类文件。JVM可以算是一个抽象的计算机,它具有一个指令集并可以使用不用的存储区域。它执行指令,还管理着数据、内存和寄存器。每个JVM都有方法区和堆被整个程序共享。JVM在加载和解析一个类之后,会将解析出来的信息保存在方法区中。

JVM的体系机构:寄存器、栈、(废区收集)堆、存储区(方法区域)、指令集。

1、指令集:JVM大概具有大约248个字节码。指令中包含一个单字节的操作符,有0个或多个操作数。许多指令没有操作数,由一个单字节的操作符构成。指令中操作数的数量和大小由操作符决定的。当操作数比一个字节大时,存储顺序是高位字节优先。

2、寄存器:JVM中的寄存器种类有4种:


PC寄存器


Java程序计数器


optop寄存器


指向操作数栈顶的指针


frame寄存器


指向当前执行方法的执行环境的指针


vars寄存器


执行当前执行方法中局部变量区的第一个变量的指针

寄存器都是32位的,其目的不是为了存储或传递参数,而是为了保证指令集的简洁性和实现时的高效性。

3、栈:局部变量区、运行环境区、操作数区。Java栈保存一个线程调用方法时的状态,包括本地变量、调用方法的参数、返回值、中间变量等等。

局部变量区:长度是32位的。长整型和双精度浮点数占据两个局部变量的空间,但是按第一个局部变量的地址作为索引来寻址。虚拟机提供指令使得局部变量区和操作数区之间的数据传递。

运行环境区:在运行环境中包含的信息作为动态链接、正常方法返回和异常传播。

1)动态链接:包括对指向当前类和当前方法的解释器符号表的指针,用于支持动态链接。方法的.class文件代码在引用要调用的方法和药访问的变量时使用符号。动态链接的作用是把符号形式的方法翻译成实际方法调用。装载必要的类以解释还没有定义的符号,并把变量访问翻译成这些变量运行时的存储结构相对应的偏移地址。

2)正常方法返回:当方法正常结束并执行了一条正确类型的返回指针时,执行环境在正常返回的请况下用于恢复寄存器, 将程序计数器加1,在执行环境中继续执行。

3)异常传播:a.异常动态链接错误,无法找到所需的class文件。b.运行时错误,对一个空指针的引用,每个catch子句包含其有效指令范围,能够处理的异常类型和处理异常的代码地址。

操作数栈区:机器指令只在操作数栈中取操作数,对它们进行操作,并将结果返回到栈中。选择栈结构是因为少量寄存器或非通用寄存器的机器上,能高效地模拟虚拟机的行为。注意:栈是32位的。

4、无用单元收集堆:运行时的数据区,即运行时用来存储类的数据的区域。类的实例从中分配空间。

5、方法区:保存方法代码(编译后的java代码)和符号表。方法代码不包括在无用单元收集堆中。另外,JVM在执行本地方法时,下一条执行指令不保存在PC寄存器中。

时间: 2024-10-05 22:52:38

JVM初识的相关文章

JVM初识、调优

JVM是按照运行时数据的存储结构来划分内存结构的,JVM在运行java时,将他们划分成几种不同格式的数据,分别存储在不同的区域,这些数据统一称为运行时数据,运行时数据包括java程序本身的数据信息和JVM运行java需要的额外的数据信息. JMM要理解 JVM运行时数据区 程序计数器--------线程私有 java虚拟机栈------线程私有 本地方法栈--------线程私有 Jav堆-------------线程公用 方法区------------线程公用 锁机制 JVM内存分配 1:栈内

JVM初识-java类加载器

前言作为一位java开发人员,不懂java虚拟机规范是会被人鄙视的,特别是工作了多年的程序人员.为了不让他人有鄙视的机会,于是本人开始了JVM的学习之旅. 学习Java虚拟机,从了解JVM内存模型开始. JVM[java虚拟机规范]内存模型图 1. Class files一般而言,我们都会将逻辑代码编写在以.java为后缀的文件中.class文件则是由java文件编译[使用javac命令编译]而成. 2. 类加载器子系统 class文件已经有了,那么class文件又是如何加载进虚拟机的呢?这时不

Java基本语法-B2

基本语法(一) 程序的基本结构 Java程序的基本形式 Java语言是面向对象的语言.Java程序主要以类的形式存在,也叫Class,类也是Java程序的最小程序单位. Java程序要求所有执行语句.方法都必须放在类里. 最简单的Java程序: class Hello { } 在上面的 Hello 类中,只是一个空类的定义,没有任何的类成分,可以通过编译,但执行时会报错误提示. 因为规定某个类如果需要被解释器直接解释执行,需要包含 main() 程序入口方法,而且还要使用 public stat

初识JVM

1. JVM简介 初识JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的. Java语言的一个非常重要的特点就是与平台的无关性.而使用Java虚拟机是实现这一特点的关键.一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码.而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译.Java语言使用Java虚拟机屏蔽了与具体平

初识JVM byte code

关于JVM和其上的byte code,网上其实有足够多的资料了,我这里就简单做个提纲和介绍,权当记录吧. stack-based VM Java byte code运行在JVM上,就像机器指令运行在物理机上,是需要遵循这个机器的指令规范的.所以认识JVM byte code,是需要稍微了解下JVM的.JVM是一个基于栈(stack-based)的虚拟机.很久以前我还写过类似简单的虚拟机. 基于栈的虚拟机其操作数和指令运算的中间结果全部都在一个虚拟栈中,与之对应的是基于寄存器(register-b

(二)初识JVM

Java是一种技术,它由四方面组成:Java编程语言.Java类文件格式.Java虚拟机和Java应用程序接口(Java API).它们的关系如下图所示:  运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将其编译成字节码(.class文件),字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的转换成机器码执行. Java平台由Java虚拟机和Java应用程序接口搭建,Java语言则是进入这个平台的通道,用Java语言编写并

JVM内存初识

内存概述 内存是计算机中的重要原件,临时存储区域,作用是运行程序.我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存.Java虚拟机要运行程序,必须要对内存进行空间的分配和管理. Java虚拟机的内存划分 JVM的内存划分: 栈:存放的都是方法中的局部变量.方法的运行一定要在栈当中. 数组在内存中的存储 public class Demo04 { public static void main(String[] args) { int[] a

初识JVM堆栈

最近看到浅拷贝与深拷贝的区别.联想到了对象的存储形式,即堆内存. 故如下主要针对java虚拟机中的堆内存与栈内存做下简单学习: 堆内存也叫运行时内存,是程序运行期间动态占用的一块内存,也是jvm中主要关注的一块内存. 引申:堆溢出与栈溢出的区别?代码分别测试下. 提示-->由于堆内存存储的是对象,所以在程序运行期间如果能够无限创建对象或数组而未被GC及时回收,就可以导致堆内存溢出. 同理,一个方法内部,无限创建变量(入栈)即可导致栈内存溢出.如:递归调用. 原文地址:https://www.cn

1 初识JVM

原文地址:https://www.cnblogs.com/likevin/p/10183644.html