JVM内存管理-对象访问

来源:互联网 发布:邪恶网站源码 编辑:程序博客网 时间:2024/06/05 02:45

程序运行时,最基本的需要使用jvm中的栈、堆、方法区,这三部分内容。

栈,存放了方法所需要的局部变量等信息。

堆,存放了类的实例化数据(即对象)。

方法区,存放了类的相关信息(class文件的信息),比如父类、接口等信息。

以下段代码为例:

Object obj = new Object();

它对应的内存示例如下图所示:


以上部分是比较基础的,但是stack和heap和方法区之间是如何联系的呢?

由于JVM规范中,对引用类型的规定是只代表着一个对象实例的引用,并没有制定具体使用哪种方式去实现,因此,出现两种可能。一、句柄方式;二、直接引用。

1、句柄引用

句柄引用的方式,是通过在堆中增加一块句柄区域,栈中的数据指向句柄,句柄中包含了堆中实例的地址和方法区中class信息的地址。如下图所示:


2、直接引用

直接引用的方式去掉了句柄区域,直接在堆的对象实例区域中包含了一块执行方法区中class文件的地址。如下图所示:


sun的虚拟机实现的是第二种方式,实现第一种方式的也比较多。

两种方式的比较:

第一种方式若对象实例发生拷贝时,不需要改变栈中变量的指向,只需要改变句柄内存的指向即可。

第二种方式的优点是速度快,毕竟少了一个过程。

0 0