JVM系列一:Java虚拟机与操做系统结构比较

在了解jvm的结构以前,咱们有必要先来了解一下操做系统的内存基本结构:java

输入图片说明

操做系统中的jvm程序员

在此输入图片描述

为何jvm的内存是分布在操做系统的堆中呢??由于操做系统的栈是操做系统管理的,它随时会被回收,因此若是jvm放在栈中,那java的一个null对象就很难肯定会被谁回收了,那gc的存在就一点意义都没有了,而要对栈作到自动释放也是jvm须要考虑的,因此放在堆中就最合适不过了。 操做系统+jvm的内存简单布局 在此输入图片描述算法

从上图中,你能够看到,jvm的内存结构竟然和操做系统的结构惊人的一致,再来看一个图。看我下面红色的标注jvm

在此输入图片描述

你应该不难发现,原来jvm的设计的模型其实就是操做系统的模型,基于操做系统的角度,jvm也就是一个应用(java.exe/javaw.exe),而基于class文件来讲,jvm就是个操做系统,而jvm的方法区,也就至关于操做系统的硬盘区,因此方法区也被叫作permanent区,由于这个单词是永久的意思,也就是永久区。而java栈和操做系统栈是一致的,不管是生长方向仍是管理的方式,至于堆嘛,虽然概念上一致目标也一致,分配内存的方式也一直(new,或者malloc等等),可是因为他们的管理方式不一样,jvm是gc回收,而操做系统是程序员手动释放,因此在算法上有不少的差别. 看下面的图。 在此输入图片描述布局

将这个图和上面的图对比多了什么?没错,多了一个pc寄存器,所谓pc寄存器,不管是在虚拟机中仍是在咱们虚拟机所寄宿的操做系统中功能目的是一致的,计算机上的pc寄存器是计算机上的硬件,原本就是属于计算机,计算机用pc寄存器来存放“伪指令”或地址,而相对于虚拟机,pc寄存器它表现为一块内存(一个字长,虚拟机要求字长最小为32位),虚拟机的pc寄存器的功能也是存放伪指令,更确切的说存放的是将要执行指令的地址,它甚至能够是操做系统指令的本地地址,当虚拟机正在执行的方法是一个本地方法的时候,jvm的pc寄存器存储的值是undefined,因此你如今应该很明确的知道,虚拟机的pc寄存器是用于存放下一条将要执行的指令的地址(字节码流)。 在此输入图片描述操作系统

这个图是要告诉你,当一个classLoder启动的时候,classLoader的生存地点在jvm中的堆,而后它会去主机硬盘上将A.class装载到jvm的方法区,方法区中的这个字节文件会被虚拟机拿来new A字节码(),而后在堆内存生成了一个A字节码的对象,而后A字节码这个内存文件有两个引用一个指向A的class对象,一个指向加载本身的classLoader设计

以下图。对象

在此输入图片描述

相关文章
相关标签/搜索