JVM全称是java Virtual Machine(java虚拟机),JVM屏蔽了与各个计算机平台相关的软件和硬件差异
在接下来的日子里,我要通过写博客的形式学习JVM,让自己更懂得Java
本系列文章是对《深入分析javaweb技术内幕》和《深入理解java虚拟机》的总结,欢迎大家一起吐槽,一起进步
本文是《JVM解读》的第一篇:JVM体系结构
JVM体系结构
JVM的基本组成
(1)指令集:JVM指令集
(2)类加载器:在jvm启动时或者类在运行时将需要的class加载到JVM中
(3)执行引擎:负责执行class文件中的字节码指令,相当于CPU
(4)运行时数据区:将内存划分成若干个区,分别完成不同的任务
(5)本地方法区:调用C或C++实现的本地方法代码返回的结果
- 类加载器ClassLoader
会在下一篇文章中详细说明ClassLoader加载机制。每一个被JVM装载的类型都有一个与之对应的java.lang.Class类的实例来表示该类型。该实例可以唯一表示被jvm装载的class类,这个实例和其他类的实例一样放在堆内存中。
- 执行引擎
执行引擎相当于线程,是JVM的核心,执行引擎的作用就是解析JVM字节码指令,得到执行的结果。执行引擎由各个厂家实现。SUN的hotspot是一种基于栈的执行引擎。而Android的Dalvik是基于寄存器的执行引擎。执行引擎也就是执行一条条代码的一个流程,代码都包含在方法体中,执行引擎本质上就是执行一个个方法串起来的流程,对应于操作系统的一个线程,每个java线程就是一个执行引擎的实例。
- java内存管理
执行引擎在执行的过程中需要存储一些东西,如操作数,操作码执行结果,class类的字节码以及类的对象等信息都需要在执行引擎执行前准备就绪。JVM有一个方法区,java堆区,java栈,PC寄存器和本地方法区。其中方法区和java堆是线程共享的。如果当前线程对应的java栈中没有栈帧,这个java栈也要被JVM撤销,整个JVM退出。
JVM选择基于栈的架构的原因
JVM执行字节码指令是基于栈的架构的,所有的操作数必须先入栈,然后根据指令的操作码选择从栈顶弹出若干个元素进行计算后再将结果入栈。JVM操作数可以存放在每一个栈帧中的一个本地变量中,即每个方法调用时就会给这个方法分配一个本地变量集,这个本地变量集在编译时就已经确定,所以操作数入栈可以直接是常量或者从本地变量集中娶一个变量压入栈中。
JVM基于栈的设计理由是
(1)JVM要设计成与平台无关的,而平台无关性就要保证在没有或者由很少的寄存器的机器上也能同样正确执行java代码,因为寄存器很难做到通用。
(2)基于栈的理由是为JVM更好地优化代码而设计的
(3)为了指令的紧凑性,因为java代码可能在网络上传输,所以class文件的大小也是设计JVM字节码指令的一个重要因素。
声明:本文很多是对《深入分析javaweb技术内幕》和《深入理解java虚拟机》的总结
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-05 04:25:33