JVM (2)-- JVM内存模型

本内容由学习《深入JAVA虚拟机》一书和众多博文归纳而成,引用《深入JAVA虚拟机》中的图例,JAVA虚拟机可以描述成如下的体系结构
这里写图片描述
class文件由ClassLoader(系统实现或自定义)装载进行JVM。根据初始化各个步骤在方法区,堆,Java栈,PC寄存器(又叫程序计数器)放置相应的数据。随后通过执行引擎来执行Java程序。在执行过程中如果要使用native方法,那么jvm就去连接并直接调用本地方法。这个本地方法栈,并不受jvm的控制。
JVM提供多线程运行模式,每个线程,都会有自己独立的PC寄存器,JAVA栈(本地方法栈应该也是)。而众多线程会共享方法区和堆。

下面来逐一深入分析内存模型中的各个部分:
一、方法区
方法区是供所有线程共享的。方法区中存储的是:class文件装载的类型相关信息,类的静态变量的相关信息,字段,方法的相关信息,常量池(直接常量和符号引用,PS:ClassA a = new ClassA()在ClassA未被装载时,所使用的是符号引用,装载后在常量池中会替换成直接引用),加载自己的ClassLoader的引用,指向这个类型信息的java.lang.Class对象的引用,这个类的实例(非抽象)方法的直接引用(方法表)。等等。具体每种信息的详细分析,请参考《深入JAVA虚拟机》5.3.4方法区,书中还详细描述了如何结合程序指令和方法区信息完成程序的执行。

方法表,方法区中的指针数组,指向一个非抽象类所拥有的所有实例方法。(包括从父类继承的方法)这样做的目的是可以明显的提高方法调用的速度,是一个很有用的设计。但是JVM中方法表是一个可选项,空间严格控制的JVM实现可以选择不实现方法表。

方法区的大小可以动态扩展(也有JVM是固定),可以通过参数来调节。方法区也可以被垃圾收集,如果一个类不再被用到,类的相关信息就可以被垃圾收集。
二、堆
堆是实例化对象和数组的存储场所,堆供所有线程所共享。注意(一)中提到的JVM实例的概念,不同的JVM实例之间,并不存在共享和同步问题。我们所说的共享堆,线程间的同步,都是指的同一个JVM实例的范畴。注意,java.lang.Class对象也是存放在堆中的。
堆中的对象可以被垃圾收集,同时垃圾收集器还可能会在堆中移动对象,就像windows磁盘碎片整理一样,达到优化目的。(GC移动对象是很常见的行为)堆本身可以是非连续的内存空间,可以动态扩展。
位于方法区中的方法表,堆中每个对象实例都有一个指针指向它。在内存非常充裕的系统中,可以直接为每个对象实例创建一个自己的方法表,这样做可以轻微提高效率。
(Java栈中)指向一个对象的引用有两种实现方式,一种是直接指向对象的指针,还有一种是指向句柄池的指针。直接指向对象,肯定更快。但是如果对象挪动位置,栈中所有的指针都必须更新。句柄池需要两次寻址,但是对象挪动时,只需要更新堆中句柄池指向对象的指针即可。
在堆中每个对象实例的数据,包括:指向方法区对应的类信息和方法表的指针;实例数据本身;这个对象自己的锁数据;等待集合(wait(),notify()使用)数据;与GC相关的信息等。其中,锁数据和等待集合数据,在一些JVM实现中会设计成开始并不存在,在第一次加锁或wait()操作时才创建。


数组,也是一种Java类,也有自己的java.lang.Class对象。同一个维度同一个数据类型的数组都属于同一类java class,和数组的长度无关。数组类的表示采用”[“表示维度,类型名表示元素类型。例如一个int[2]对象的java类是“[I”,一个 Object[2][2]表示为“[[java/lang/Object”在堆中存放的数组对象,除了上述数据外还需要额外存储一个长度数据。
这里写图片描述


三、PC寄存器
一块较小的内存空间,在执行java方法时,寄存器始终指向下一条指令。寄存器为每个JAVA线程所单独拥有。寄存器由CPU使用,CPU为每个线程分配时间片,然后调用这个线程中的寄存器执行指令。
四、JAVA栈
Java栈同样是线程独有。使用栈那就是两种操作:push和pop。Java栈的内存空间也可以不连续和动态扩展。每当线程调用一个Java方法时,就会创建一个栈帧压入Java栈。这个栈帧用来存储方法参数,局部变量,中间运算结果等数据。
五、本地方法栈
任何某种本地方法接口都会使用本地方法栈,调用本地方法时JVM并不会创建新的栈帧压入Java栈,而是动态的连接本地方法栈。在本地方法栈中也可能会调用Java方法,这个过程也是没有什么障碍的。本地方法栈同样可以不连续和动态扩展。

更多更详细的信息请阅读《深入JAVA虚拟机》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值