Java虚拟机内部构成浅析

简介:

转自(http://developer.51cto.com/art/200906/130148.htm)

   Java虚拟机是一个想象中的机器,正如其名是虚拟的。在实际计算机上市通过软件模拟实现的。它有虚拟的硬件,如处理器、堆栈、寄存器等,还有相应的指令系统。它屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码即字节码,这样就可以在多个平台上不加修改的运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这正是Java语言具有与平台无关性的原因。

   Java虚拟机由五部分组成:指令集、寄存器、栈、无用单元回收堆(garbage-collected-heap)、方法区域。它们构成了Java虚拟机的逻辑成份,不依赖任何实现技术或组织方式,但他们的功能必须在真实机器上以某种方式实现。Java虚拟机支持大约248个字节码。每个字节码执行一种基本的CPU运算,例如,把一个整数加到寄存器,子程序转移等。Java指令集相当于Java程序的汇编语言。其中的指令包含一个单字节的操作符,用于指定要执行的操作,还有0个或多个操作数,提供操作所需的参数或数据。许多指令没有操作数,仅有一个单字节的操作符构成。虚拟机的內层循环的执行过程如下:

   do{取一个操作符字节:根据操作符的值执行一个动作;}while(程序未结束)

   由于指令系统的简单性,使得虚拟机的执行过程十分简单,从而有利于提高执行效率。指令中操作数的数量和大小是由操作符决定的。如果操作数比一个字节大那么它存储的顺序是高字节优先。例如,一个16位的参数存放时占用两个字节,其值为第一个字节×256+第二个字节。字节码指令流一般只是字节对齐的。指令tableswitch和lookup是例外,这两条指令内部要求强制的4字节边界对齐。

   Java虚拟机的寄存器用于保存机器的运行状态,与微处理器中的某些专用寄存器类似。Java虚拟机的寄存器有4种:pc:Java程序计数器,optop:指向操作数栈顶端的指针,frame:指向当前执行环境的指针,vars:指向当前执行方法的局部变量区第一个变量的指针。Java虚拟机是栈式的,他不定义或使用寄存器来传递或接受参数,其目的是为了保证指令集的简洁性和实现时的高效性特别是对于寄存器数目不多的处理器。所有寄存器 都是32位的。

   Java虚拟机的栈有三个区域:局部变量区、运行环境区、操作数区。局部变量区每个Java方法使用一个固定大小的局部变量集。它们按照与ars寄存器的字偏移量来寻址。局部变量都是32位的。长整数和双精度浮点数占据了2个局部变量的空间,却按照第一个局部变量的索引来寻址。虚拟机规范并不要求在局部变量中的64 为的值是64位对其的虚拟机提供了把局部变量中的值装载到操作数栈的指令,也提供了把操作数栈中的值写入局部变量的指令。

   在运行环境中包含的信息用于动态链接,正常的方法返回以及异常传播。运行环境包括对指向当前类和当前方法的解释器符号表的指针,用于支持方法代码的动态链接。方法的class文件代码在引用要调用的方法和要访问的变量时使用符号。动态链接把符号形式的方法调用翻译成实际方法调用,装载必要的类以解释还没有定义的符号,并把变量访问翻译成与这些变量运行时的存贮结构相应的偏移地址。动态链接方法和变量使的方法中使用的其它类的变化不会影响到本程序的代码。如果当前方法正常地结束了,在执行了一条具有正确类型的返回指令时,调用的方法会得到一个返回值。执行环境在正常返回的情况下用于恢复调用者的寄存器,并把调用者的寄存器计算器增加一个恰当的值,一跳过已执行过的方法。调用指令然后再调用者的执行环境中继续执行下去。异常情况下在Java中被称作error(错误)或exception(异常),是throwable类的子类。在程序中出错的原因是动态链接出错如无法找到所需class文件,运行时出错如一个空指针的引用。程序使用了throw语句。

   当异常发生时,Java虚拟机采取如下措施:检查与当前方法相关的catch子句表,每个catch子句包含其有效指令范围,能够处理异常类型以及处理异常代码块地址。与异常相匹配的catch子句应该符合一下条件:造成异常的指令在指令范围内,发生异常类型是其能够处理的异常类型的子类型。如果找到了匹配的catch子句,那么系统转到异常处理模块执行;否则重复寻找直到找到为止。如果找不到则得到一个“未截获异常”的结果并返回到当前方法的调用者好像异常刚刚在其调用者中发生一样。如果调用者仍然没有找到相应的异常处理,那么系统将调用一个缺省的异常处理模块。

   机器指令只从操作数栈中取操作数,对他们进行操作,并把结果返回到栈中。栈用于给方法传递参数并从方法接受结果,也用于支持操作数的参数并保存操作结果。Java的堆是一个运行时数据区,类的实例从中分配空间。Java语言有无用单元回收功能:不给程序员显式释放对象的能力。不规定具体使用的无用单元收集算法。可以根据系统需求使用各种各样的算法。

方法区与传统语言中的编译后代码或是unix进程中的正文段相似。保存方法代码(编译后的Java代码)和符号表。在当前的Java实现中,方法代码不包括在无用回收集堆中但计划在将来的版本实现。



本文转自 古道卿 51CTO博客,原文链接:http://blog.51cto.com/gudaoqing/1270855

相关文章
|
1月前
|
存储 Java 数据安全/隐私保护
【JVM】Java虚拟机栈(Java Virtual Machine Stacks)
【JVM】Java虚拟机栈(Java Virtual Machine Stacks)
36 0
|
4月前
|
监控 安全 Java
Java基础知识:解释一下Java虚拟机(JVM)是什么。
Java基础知识:解释一下Java虚拟机(JVM)是什么。
39 3
|
27天前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
75 0
|
3月前
|
Linux Windows
FinalShell连接Linux虚拟机报错java.net.ConnectException: Connection timed out: connect(亲测有效)
FinalShell连接Linux虚拟机报错java.net.ConnectException: Connection timed out: connect(亲测有效)
167 0
|
1月前
|
存储 Java 开发者
深入理解Java虚拟机(JVM)内存管理
【2月更文挑战第11天】 在本篇文章中,我们将深入探讨Java虚拟机(JVM)的内存管理机制,一项对于优化Java应用性能至关重要的技术领域。不同于常规的技术文章摘要,我们不仅概述了JVM内存管理的基本概念,还将引导读者通过实际案例理解其在现实世界应用中的重要性。从堆(Heap)和栈(Stack)的区别开始,到垃圾收集(Garbage Collection)机制的工作原理,本文旨在为Java开发者提供一个清晰、系统的JVM内存管理知识框架,帮助他们在开发过程中做出更加明智的决策。
|
2月前
|
存储 算法 Java
Java虚拟机内存管理机制
【2月更文挑战第7天】本文主要介绍了Java虚拟机内存管理机制的基本原理和实现方式。Java虚拟机的内存管理机制是Java程序运行的重要组成部分,对程序性能和稳定性有着直接的影响。文章首先从Java虚拟机内存模型入手,介绍了Java虚拟机中堆内存、方法区、栈、PC寄存器等内存区域的功能特点和使用方式;然后详细阐述了Java虚拟机内存管理机制的垃圾回收算法和回收器的分类、优化和实现过程;最后介绍了一些常见的内存问题和优化技巧,以及如何通过代码调优和合理使用内存配置参数来提高程序的性能和稳定性。
|
3月前
|
安全 前端开发 Java
【JVM】<Java虚拟机>JVM架构&各种**虚拟机
【1月更文挑战第26天】【JVM】<Java虚拟机>JVM架构&各种**虚拟机
|
3月前
|
自然语言处理 Oracle Java
【JVM】<Java虚拟机>JVM和JAVA体系结构
【1月更文挑战第26天】【JVM】<Java虚拟机>JVM和JAVA体系结构
|
4月前
|
运维 算法 安全
阿里P8写出的《深入理解Java虚拟机3》轻松学会JVM底层
Java是目前用户最多、使用范围最广的软件开发技术,Java的技术体系主要由支撑Java程序运行的虚拟机、提供各开发领域接口支持的Java类库、Java编程语言及许许多多的第三E方Java框架(如Spring、 MyBatis等) 构成。在国内,有关Java类库API、Java语言语法及第三方框架的技术资料和书籍非常丰富,相比而言,有关Java虚拟机的资料却显得异常贫乏。
|
7天前
|
缓存 监控 Java
深入理解Java虚拟机(JVM)性能调优
【4月更文挑战第18天】本文探讨了Java虚拟机(JVM)的性能调优,包括使用`jstat`、`jmap`等工具监控CPU、内存和GC活动,选择适合的垃圾回收器(如Serial、Parallel、CMS、G1),调整堆大小和新生代/老年代比例,以及代码优化和JIT编译策略。通过这些方法,开发者能有效提升应用性能并应对复杂性挑战。性能调优是持续过程,需伴随应用演进和环境变化进行监控与优化。