java虚拟机体系结构

java虚拟机(Java Virtual Machine)是运行所有Java程序的抽象计算机,是Java语言的运行环境。支持Java面向网络体系结构三大支柱的所有方面:平台无关性、安全性和网络移动性。

 

jvm体系结构图

 

根据上图所示,java虚拟机体系结构中最重要的部分就是类装载子系统、运行时数据区、执行引擎等

 

类装载子系统

 Java虚拟机中,负责查找并装载类型的那部分称为类装载子系统。
  Java虚拟机有两种类装载器:启动类装载器和用户自定义类装载器。启动类装载器是Java虚拟机实现的一部分。用户自定义类装载器是Java程序的一部分。
  类装载器的动作:

   1. 装载---查找并装载类型的二进制数据

   2. 连接---执行验证,准备,以及解析(可选)
      验证:确保被导入类型的正确性
      准备:为类变量分配内存,并将其初始化为默认值
      把类型中的符号引用换为直接引用

   3. 初始化---把类变量初始化为正确的初始值 

 

运行时数据区
(1) 方法区

当JVM使用类装载器定位Class文件,并将其输入到内存中时。会提取Class文件的类型信息,并将这些信息存储到方法区中。同时放入方法取中的还有该类型中的类静态变量。下面我们具体看看需要存储哪些信息?
●该类型的全限定名。
●该类型的直接超类的全限定名。
●该类型是类类型还是接口类型。
●该类型的访问修饰符(public、abstract、final)。
●任何直接超接口的全限定名的有序列表。
●该类型的常量池。比如所有类型、方法和字段的符号。基本数据类型的直接数值等。
●字段信息。对类型中声明的每个字段,方法区中必须保存下面的信息。除此之外,这些字段在类或者接口中的声明顺寻也必须保存。

      字段名

      字段的类型

      字段的修饰符(public, private, protected, static, final, volatile, transient的某个子集)

●方法信息。和字段一样保存方法的相关信息。

      方法名

      方法的返回类型

      方法的参数的数量和类型

      方法的修饰符

      方法的字节码

      操作数栈和栈帧中局部变量的大小 (见下面Java栈的内容)

      异常表
●类静态变量。这里要注意:类中的静态变量时存放在方法区中的。并不是存放在堆中某一个该类型的对象中的。 也就是我们常说的“类静态变量属于类,而不属于对象”这句话的由来了。
●指向ClassLoader类的引用。任何类都需要被类装载器装入内存。如果是被用户自定义类装载器装载的,那么JVM必须在类型信息中存储对该装载器对象的引用。

●指向Class类的引用。对于每一个被装载的类型,虚拟机都会相应的为它创建一个java.lang.Class类的实例,而且虚拟机还必须以某种方式把这个实例和存储在方法区中的类型信息关联起来。 这就使得我们可以在程序运行时查看某个加载进内存的类的当前状态信息。也就是反射机制实现的根本。

●方法表。 为了能快速定位到类型中的某个方法。JVM对每个装载的类型都会建立一个方法表,用于存储该类型对象可以调用的方法的直接引用,这些方法就包括从超类中继承来的。而这张表与Java动态绑定机制( 参见《java动态绑定机制实现多态 》 )的实现是密切相关的。

(2) 堆

堆存放所有生成的对象及对象的实例变量。JVM会根据new指令在堆中开辟一个确定类型的对象内存空间。但是堆中开辟对象的空间并没有任何 人工 指令可以回收,而是通过JVM的垃圾回收器负责回收。


(3) 程序计数器

对于一个运行的Java而言,每一个线程都有一个PC寄存器。当线程执行Java程序时,PC寄存器的内容总是下一条将被执行的指令地址。


(4) Java栈 

每启动一个线程,JVM都会为它分配一个Java栈,用于存放方法中的局部变量,操作数以及异常数据等。当线程调用某个方法时,JVM会根据方法区中该方法的字节码组建一个栈帧。并将该栈帧压入Java栈中,方法执行完毕时,JVM会弹出该栈帧并释放掉。

注意,Java栈中的数据是线程私有的,一个线程是无法访问另一个线程的Java栈的数据。这也就是为什么多线程编程时,两个相同线程执行同一方法时,对方法内的局部变量时不需要数据同步的原因。

 

执行引擎

执行引擎处于JVM的核心位置,在Java虚拟机规范中,它的行为是由指令集所决定的。尽管对于每条指令,规范很详细地说明了当JVM执行字节码遇 到指令时,它的实现应该做什么,但对于怎么做却言之甚少。Java虚拟机支持大约248个字节码。每个字节码执行一种基本的CPU运算,例如,把一个整数 加到寄存器,子程序转移等。Java指令集相当于Java程序的汇编语言。

Java指令集中的指令包含一个单字节的操作符,用于指定要执行的操作,还有0个或多个操作数,提供操作所需的参数或数据。许多指令没有操作数,仅由一个单字节的操作符构成。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java体系结构特性主要包括跨平台性、安全性、简单性和可移植性。 首先是跨平台性,即Java程序可以在不同的操作系统上运行。这是因为Java程序在编译时会被转换成字节码而不是机器码,而字节码可以由Java虚拟机JVM)来解释执行。不同的操作系统只需要安装相应的JVM即可运行相同的Java程序,极大地提高了程序的可移植性。 其次是安全性,Java引入了一系列安全机制来保护计算机和网络的安全。Java的安全性主要通过字节码校验、安全沙箱和安全管理器来实现。字节码校验可以检查Java程序的合法性,以防止恶意代码的执行;安全沙箱可以限制Java程序对计算机资源的访问,确保程序不能越权操作;安全管理器可以定义安全策略,对程序的访问进行控制。 再次是简单性,Java的设计目标之一就是简单易学。Java的语法相对简单,去除了C++中复杂的特性,同时提供了垃圾回收和自动内存管理等功能,减轻了程序员的工作负担。Java还提供了丰富的类库,使得开发人员能够更加便捷地编写代码。 最后是可移植性,即Java程序可以在不同的硬件和操作系统上运行。通过Java虚拟机的存在,Java程序不需要针对特定的硬件和操作系统进行优化和适配,使得程序的移植性非常好,减少了开发人员的工作量。 综上所述,Java体系结构特性的跨平台性、安全性、简单性和可移植性使得Java成为一种广泛应用于各种领域的编程语言。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值