`
orange5458
  • 浏览: 347645 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JVM体系结构

 
阅读更多

1.关于JVM

1)它是一个抽象规范,这个规范约束了JVM到底是一个什么东西,它有哪些组成部分,这些抽象的规范都在《The Java Virtual Machine Specification》中详细描述了。

2)一个具体实现,不同的厂商按照这个抽象的规范采用不同的方式在不同的平台上进行实现,如Sun HotSpot,BEA JRockit,IBM J9。

3)一个运行实例,当用一个具体实现来运行一个Java程序时,它就是一个运行中的实例,每个运行中的Java程序都是一个JVM实例。

4)JVM和实体机一样也必须有一套合适的指令集,这个指令集能够被JVM解析执行。这个指令集我们称为JVM字节码指令集,只要符合class文件规范的字节码都可以被JVM执行。

2.JVM体系结构



1)类加载器:将需要的class字节码加载到JVM中,每一个被加载到JVM的class字节码都有唯一的一个java.lang.Class实例与之对应,并且该实例和其他实例一样都放在JVM的堆中。

2)执行引擎:解析JVM字节码指令,得到执行结果。在《Java虚拟机规范》中详细地定义了执行引擎遇到每条字节码指令应该处理什么,并且应该得到什么,但是没有规定执行引擎应该如何或者采取什么方式处理而得到这个结果,而是由JVM的实现厂家去决定。

执行引擎也就是执行一条条代码的一个流程,而代码是包含在方法体内的,所以执行引擎本质就是执行一个个方法所串起来的流程,对应到OS中一个执行流程就是一个Java线程,即每个Java线程就是一个执行引擎的实例。

3)方法区:在类装载器加载class文件到内存的过程中,虚拟机会提取其中的类型信息,并将这些信息存储到方法区。方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。由于所有线程都共享方法区,因此它们对方法区数据的访问必须被设计为是线程安全的。
4)堆:存储Java程序创建的类实例。所有线程共享,因此设计程序时也要考虑到多线程访问对象(堆数据)的同步问题。

5)Java栈:Java栈是线程私有的。每当启动一个新线程时,Java虚拟机都会为它分配一个Java栈。Java栈以帧为单位保存线程的运行状态。虚拟机只会直接对Java栈执行两种操作:以帧为单位的压栈或出栈。当线程调用java方法时,虚拟机压入一个新的栈帧到该线程的java栈中。当方法返回时,这个栈帧被从java栈中弹出并抛弃。一个栈帧包含一个java方法的调用状态,它存储有局部变量表、操作栈、动态链接、方法出口等信息。

6)PC寄存器:一个运行中的Java程序,每当启动一个新线程时,都会为这个新线程创建一个自己的PC(程序计数器)寄存器。程序计数器的作用可以看做是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Natvie方法,这个计数器值则为空(Undefined)。

7)本地方法栈:本地方法栈与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。任何本地方法接口都会使用某种本地方法栈。当线程调用Java方法时,虚拟机会创建一个新的栈帧并压入Java栈。然而当它调用的是本地方法时,虚拟机会保持Java栈不变,不再在线程的Java栈中压入新的帧,虚拟机只是简单地动态链接并直接调用指定的本地方法。如果某个虚拟机实现的本地方法接口是使用C连接模型的话,那么它的本地方法栈就是C栈。

3.参考资料

《深入分析Java Web 技术内幕》

http://www.cnblogs.com/evan2012/archive/2012/05/09/2489417.html

  • 大小: 50 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics