数组在java内存模型中是怎样的?
先了解下几个基础概念:
1.堆。数据都基本都放在堆里头,比如数组啊,值啊,这些值都是在堆里随便找个地方放着的,给个@xxx的牌子放在栈帧里。可以理解为仓库,放货的地方。
2.栈。栈里面放的帧,一帧一帧的从最底下往上,跑完一个删一帧。
3.帧。一帧一帧的运行,跑完后会清空掉,这里面放的东西不太多,比如仓库地址什么的(牌子)。
1 | public class Debug01_swapByArray { |
我们把debug标识在第13行并运行看看。
可以看出栈里有2帧。
swap:19,Debug01_stackText(com.company.phase01) //swap()帧
{
data = {int[2]@808}{
0 = 5 //这个堆的808号地址的第一个和第二个柜子都放了5
1 = 5
}
data[1] = 5
data[0] = 3
}
main:11,Debug01_stackText(com.company.phasa01) //main()帧
{
args = {string[0]@807}
swapdata = {int[2]@808}{
0 = 3
1 = 5
}
swapdata[1] = 5
swapdata[0] = 3
}
当前大致结构如下:
1 | 栈 堆 |
args:string型数组,既然是数组就从堆搞。
让我们下一步。
新建个t并赋值3,
这意味着swap()帧中要添加个t = 3。 //没去堆里
再下一步。
data[0]赋值为5,
swap:data = {int[2]@808}{
0 = 5 //在堆中被修改了
1 = 5
}
main:swapdata = {int[2]@808}{
0 = 5 //main里的swapdata[0]也被同步修改了
1 = 5
}
可见同@号的值在方法中被修改,导致堆里的值变化,反馈在所有牌子上的码也会变。
让我们接着下一步。
data[1]=t //data:{5,3} t:3
swap:data = {int[2]@808}{
0 = 5
1 = 3 //在堆中又被修改了
}
main:swapdata = {int[2]@808}{
0 = 5
1 = 3 //main里的swapdata[1]照旧被同步修改
}
下一步,走出swap(),结果运算完毕,该帧删除,main中值成功变化,swap交换有效。
这就是我分析的java内存模型了,以后再补别的。