Java 对象数组的内存模型是怎样的?

Java 引用类型数组内存模型,下面哪一种是正确的?对象数组的每个元素都会在栈内存中有一个引用吗?

看了两个老师的教程,画内存图的时候有点不一样

相关代码

Person[] per = new Person[]{
        new Person("A", 1),
        new Person("B", 2),
        new Person("C", 3)        
    };

版本1:
版本1

版本2:
图片描述

我个人觉得两个都对,只是第一是简化版,如果按我的理解,更倾向于版本2。只是有一点疑惑,数组存的是匿名对象,匿名对象会在栈中有引用吗?

阅读 3.8k
4 个回答

1是对的,2是错的。java对象在堆中分配,数组是对象,所以分配在堆中

版本2是哪个老师教的,去怼他。

图一是正确的,栈里面不存在per[0],pr[1],per[2]这些引用,看一下

Person[] per = new Person[]{
        new Person("A", 1),
        new Person("B", 2),
        new Person("C", 3)        
    };

这段代码在局部变量表只占per一个槽数,locals=1,
可以使用javap -v看一下

这和是不是JAVA已经没有关系了吧。。
这其实是指针的概念,栈里只会保存数组的头地址,per[1],per[2]其实是地址+1 +2,并没有具体的per[1],per[2]变量

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题