JVM,即Java虚拟机,是Java程序能跨平台无障碍运行的一个基础,我觉得更好的理解Java虚拟机有助于更加深刻的理解Java语言,虽然Java自身为我们提供了一套比较成熟完善的机制,包括垃圾回收机制,这让我们在开发中十分方便,甚至会忘记内存回收这件事,但是更深入的了解java的底层还是必不可少的。下面记录一下JVM的结构,之后也会分享更多关于JVM的学习。


     收到JVM的结构,不得不贴出一张图:

    


上图很直观的显示了JVM的主要结构,可以看出主要包括以下几部分:

1.类装载器(ClassLoader):在JVM启动以及需要某个类的时候,他就负责吧class文件加载到JVM中

2.内存区:这一部分是重点,下面将会重点讲,所有的有关内存分配,以及内存回收的事都在这部分里

3.执行引擎:负责执行class文件中包含的字节码指令



再来看看内存模型,也贴出一张图:


简要的说内存里主要分为了栈(Stack),堆(heap),代码区静态区等,下面就按上图分的每个区具体说说每个区:

1.虚拟机栈(Stack):这里面就是一个栈,存放基础类型如int,float等等这种变量(这与C++一样),同时对于对象,这里还存放着各个对象实例在堆(heap)中的地址。

2.堆(heap):这里面就是存放各个对象实例了,当用户new一个实例时,就会在堆里面开一块区域了,所以垃圾回收机制也是在这一块对内存进行回收的。

3.方法区:又叫静态区,用于存储类结构信息的地方,包括常量池、静态变量、构造函数等。存储包括:

   ①类信息:如该类的全名,访问修饰符,该类的类型(类还是接口),该类的常量池等类信息

   ②方法信息:如方法名,方法返回类型,方法修饰符啊等信息

   ③.静态变量

   ④常量池。 存储了诸如符号常量、final常量值、基本数据类型的字面值等内容。

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

4.本地方法栈与虚拟机栈基本类似,区别在于虚拟机栈为虚拟机执行的java方法服务,而本地方法栈则是为Native方法服务。

5.程序计数器:学过计算机组成原理的应该对这个不陌生,是最小的一块内存区域,它的作用是当前线程所执行的字节码的行号指示器,在虚拟机的模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、异常处理、线程恢复等基础功能都需要依赖计数器完成。


堆和方法区都是线程共享的。

以上就是JVM的体系结构以及java的内存模型,接下来将会研究一下JVM的垃圾回收机制,也就是它的GC算法。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐