初探JVM------内存布局(二)

文章中讲到,通常情况下,在研究JVM内存布局时,研究的是java虚拟机栈

结合讲到的这一点和之前接触到的栈堆知识,还觉得挺合理的,貌似并没有什么冲突,只是之前学习到的东西不全面而已。

每一个运行在Java虚拟机里的线程都拥有自己的线程栈,且仅能访问自己的线程栈。

这一句话也比较容易理解,在前一篇文章中学习过,内存区域分为独享区域和共享区域两类,这里的线程栈属于独享区域。

在接下来文章中提到的几点里,有一部分再次刷新了我对内存布局的认识。

  • 一个本地变量可能是原始类型,在这种情况下,它总是“呆在”线程栈上。

  • 一个本地变量也可能是指向一个对象的一个引用。在这种情况下,引用(这个本地变量)存放在线程栈上,但是对象本身存放在堆上。

  • 一个对象可能包含方法,这些方法可能包含本地变量。这些本地变量任然存放在线程栈上,即使这些方法所属的对象存放在堆上。

  • 一个对象的成员变量可能随着这个对象自身存放在堆上。不管这个成员变量是原始类型还是引用类型。

  • 静态成员变量跟随着类定义一起也存放在堆上。

  • 存放在堆上的对象可以被所有持有对这个对象引用的线程访问。当一个线程可以访问一个对象时,它也可以访问这个对象的成员变量。如果两个线程同时调用同一个对象上的同一个方法,它们将会都访问这个对象的成员变量,但是每一个线程都拥有这个本地变量的私有拷贝。


之前的所了解到的是,基本数据类型的值保存在栈中,引用数据类型的地址保存在栈中,值保存在堆中。

但是,在文章中明确地指出,一个对象的成员变量可能随着这个对象自身存放在堆上,不管这个成员变量是原始类型还是引用类型。

而在文章的末尾,我又发现了这样一句话,因为,这些变量是成员变量,所以它们任然随着该对象存放在堆上,仅有本地变量存放在线程栈上。

再结合从网上找到的资料可以总结一个结论,成员变量是随对象存储在堆中的,而局部变量是存储在java虚拟机栈中的。

原文地址:https://www.cnblogs.com/wxdmw/p/13695964.html