一、jvm整体结构

------------恢复内容开始------------

JVM架构模型

一、Jvm简图

 这张图是针对当前最流行的HotSpot VM虚拟机来说。

其中名称以及作用:

1.classFiles:字节码文件。

2.类装载器子系统(加载器):将class文件加载为一个类。

3.其中方法区和堆是线程共有的,而java栈、本地方法栈、程序计数器是线程独有的。

4.程序计数器:程序计数器是一块较小的内存空间,可以把它当做当前线程所执行的字节码的行号指示器。程序的分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖程序计数器完成。

5.Java栈(Java虚拟机栈):Java栈描述的是Java方法执行的线程内存模型:每个方法执行的时候,Java虚拟机都会同步创建一个栈帧(栈帧是方法运行使其很重要的基础数据结构)用于存储局部变量表、操作数栈、动态连接、方法出口  等信息。每一个方法被调用直到执行完毕的过程,对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

6.本地方法栈:本地方法栈与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native)方法服务。

7.堆(Java堆):Java堆是虚拟机所管理的内存中最大的一块内存空间。此内存区域的唯一目的就是存放对象实例。Java堆是垃圾收集器管理的内存区域,因此也被称为“GC堆”。

  如果从内存分配的角度来看,所有线程共享的Java堆中可以划分多个线程私有的分配缓冲区,可以提升对象分配时的效率,将Java堆细分的目的是为了更好的回收内存,或者更快的分配内存。

8.方法区:与Java堆一样,是多个线程共享的内存区域,用于存储已被虚拟机加载的类型信息、常量、静态常量、即时编译器编译后的代码缓存等数据。在jdk6的时候Hotspot开发团队就有了放弃永久代,逐步改用本地内存来实现方法区,  到了jdk8完全废弃了永久代的概念,改用在本地内存中实现元空间来代替。

9.运行时常量池:是方法区的一部分,用于存放编译时期生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。

10.执行引擎:将字节码编译成机器码(即汇编语言)交由操作系统完成。

二、指令架构

java编译器输入指令流是基于栈的指令集架构,另外一种指令架构基于寄存器指令集架构

两种指令集架构特点:

基于栈的指令集架构:

  1.设计和实现更简单,适用于资源受限的系统;(栈的资源有限)

  2.避开了寄存器的分配难题:使用的是零地址指令分配方式(零地址指令:只有操作数,没有地址指向操作数)

  3.指令流中大部分指令是零地址指令,执行过程依赖于栈操作。

    优点:指令集合小,编译器容易实现

    缺点:完成一项操作需要更多的指令完成(栈的原因导致),效率低

  4.不需要硬件的支持,可移植性好,利于跨平台(没有和硬件挂钩)

基于寄存器指令集架构特点:

  1.典型应用:传统pc以及android的Davlik虚拟机

  2.指令集架构依赖于硬件,可移植性差

  3.性能优秀,执行效率高(因为花费更少的指令去执行一个操作)

  4.大部分情况下,寄存器指令集往往都是一地址指令、二地址指令和三地址指令为主(指令集合大)

猜你喜欢

转载自www.cnblogs.com/Aaron-cell/p/12617177.html