为了账号安全,请及时绑定邮箱和手机立即绑定

Java 属性 在JVM中保存的地方 的问题

Java 属性 在JVM中保存的地方 的问题

斯蒂芬大帝 2019-03-21 14:19:41
遇到一个难题,来iteye问一下,一直以来有几个疑问,关于成员变量在jvm中保存的位置有一些疑问。class TestObject {public static Object objstatic = new Object();public int i = 1;public static int j = 2;private String privateString = "private";public static void main(String [] args) {TestObject to = new TestObject();}}问题1:TestObject 类里面有四个属性,初始化对象时,这四个属性分别保存在内存中的哪儿?问题2:objstatic/i/j/privateString 这四个引用保存在内存中的哪儿?麻烦讲详细一点,谢谢各位了。。跪谢!
查看完整描述

7 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

objstatic/j 在方法区
i/privateString 在堆上
作用域在方法内的变量,会在当前栈上申请空间。基本变量的,保存的是变量的值,对象或者数组的话,保存的是指针,指向堆上该对象/数组的位置。
所以你在方法里,new TestObject()的时候是在堆上申请一块空间的,当TestObject obj = 的时候在栈上申请一块空间,存放指向堆上内存的位置。
至于static的变量的话,是在类加载时候已经申请好的了,这块区域叫做方法区。其存放的内容也和栈上的类似,基本类型存放值,引用类型存储指针。
每个对象在堆上的存储结构中,会在头部有一个对象头,对象头里保存着对象锁信息,更重要的是一个指向其类定义方法区的指针。所以你使用obj.j也是可以访问到值的,虽然会在编译时有警告。

查看完整回答
反对 回复 2019-04-29
?
RISEBY

TA贡献1856条经验 获得超5个赞

public static Object objstatic = new Object(); //objstatic :方法区,new Object() :堆

public int i = 1; // 堆

public static int j = 2; // 方法区

private String privateString = "private"; // privateString:堆,"private":方法区


查看完整回答
反对 回复 2019-04-29
?
ibeautiful

TA贡献1993条经验 获得超5个赞

寄存器:我们在程序中无法控制

栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中

堆:存放用new产生的数据

静态域:存放在对象中用static定义的静态成员

常量池:存放常量

非RAM存储:硬盘等永久存储空间


查看完整回答
反对 回复 2019-04-29
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

objstatic这个引用应该在方法区里面,对象则应该在堆中。
i这个变量应该和这个TestObject对象一起放在堆中。
j应该在方法区里。
privateString放在常量池里。

查看完整回答
反对 回复 2019-04-29
  • 7 回答
  • 0 关注
  • 1046 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号