关于 "int a = 5" 引出对JVM堆栈的理解

10 篇文章 0 订阅

首先上一张Java虚拟机运行时数据区域的图

第一、int a = 5,在内存中是如何的呢?

一位老兄给的言简意赅的回答: 
"int a" => 分配一块内块
"= 5" => 内存赋值为常量5[/quote]

引用这位老兄的回答,再加上我的理解: 

int a = 5;
1.我们假设int a 分配到的内存地址为0xaa。
2.int a存储空间最大为4个字节, 也就是2^32, 也就是可以存储的最大值为2^32.
3. = 5, 就是把这块地址0xaa, 存储值为5.

综上所述, int a = 5. 
1. a是这块内存的名称, 程序员写代码时规定的, 经过编译器编译后, a是计算机不可见.
2. 0xaa是这块内存的地址, 是计算机内存自动分配的, 编译后0xaa计算机仍然可见.
3. int型 值5 是名字为a且地址为0xaa的内存存储的值.

对应到JVM中, 这段语句赋值, 就是虚拟机栈中的一块内存的赋值操作, 其中, 这块内存被程序员写代码时叫做a, 且被虚拟机分配了内存地址为0xaa, 且存储了int型 值5.

第二、int[] a = {5,6,7,8,9}内存模型又是怎样的?

因为是数组类型int[] a, 所以a便是一个引用类型, 则必然有名称为a的内存, 同第一的分析: 这块内存必然有内存地址, 我们也将其地址假设为0xaa.

承上, 这里就有一个问题了, 既然是名称为a且内存地址为0xaa的一块内存, 那么这块内存必然存储了一个值(因为这里赋值了嘛), 这个值会不会就是是{5,6,7,8,9}呢?

不是的, 在多数JVM中规定: 引用类型和数组类型的对象都要被保存到堆内存中. 所以数组对象{5,6,7,8,9} 是保存在堆内存中的, 假设保存数组对象{5,6,7,8,9}的内存的内存地址为0xbb.

综上所述: 上面 "栈内存中名字为a且内存地址为0xaa的一块内存" 存储的值是 "堆内存中一块内存的地址0xbb", 0xbb是 "堆内存中的一块内存的地址", 指向了 "保存数组对象{5,6,7,8,9} 的内存".

ps: 这句总结略绕, 请注意理解句子中各个部分的逻辑关系, 已经添加了双引号, 作为断句.

从这里引出的堆栈关系如下图:

"int a, 地址为0xaa的内存" 保存了 "用来存储数组对象{5, 6, 7, 8, 9}的内存的地址值0xbb", 因此, a 是指向了内存0xbb的, 从逻辑上就是指向了数组对象{5, 6, 7, 8, 9}.

 

ps: 这个堆栈模型是很粗浅的JVM堆栈模型, 是我们了解基础类型, 引用类型对象存储的内存模型。若想深入理解JVM请参看Java虚拟机规范, 以及深入理解Java虚拟机规范等丛书.

,

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值