successfulroof 2013-06-21 21:08
浏览 372
已采纳

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

遇到一个难题,来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 这四个引用保存在内存中的哪儿?

麻烦讲详细一点,谢谢各位了。。跪谢!

  • 写回答

8条回答 默认 最新

  • dsm02955299 2013-06-22 20:57
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog