java 栈内存问题,int a=1;int b=1;分配了几块内存?

King_YSX 2019-01-18 11:32:54
最近在学习java内存管理这一块,有一个疑惑,也没有查到相关资料,所以在此发帖:
int a=1; int b=1;两个局部变量是存在栈内存当中,其中b=1编译时,是将b也指向了1;
那么b到底有没有开辟新内存呢?如果开辟了,那么b到底存的是什么呢?
按照JVM内存模型,b在栈内存中存储的应该直接就是其直,如果存的也是1,那么又
为什么说是a和b都指向了1,并且提高了jvm的性能呢?
所以int a=1; int b=1;到底开辟了几块内存?又是如何存储的呢?
...全文
1403 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 1 楼 Vincent光光 的回复:
三块内存。 首先知道,int a=1不是一个原子操作,它分为:在堆开辟一块内存空间,为内存赋值,引用这块内存。在堆开辟内存空间的时候,产生了第一块内存。然后引用的时候,在栈中开辟了一块内存,用于存放引用,这是第二块内存。当运行到int b = 1的时候,由于1已经存在于常量池中,故不再堆中开辟空间,所以只有在栈中开辟b的引用内存空间,这是第三块内存。 个人见解!
你这个说的有点问题,这种变量直接指向基础数据类型的情况不涉及到对象创建
milkhq 2019-07-30
  • 打赏
  • 举报
回复
lz的问题:int a=1; int b=1;到底开辟了几块内存?又是如何存储的呢? 1)当栈内存中已经有了变量值1,则开辟2块内存; 当栈内存中没有变量值1,则开辟3块内存。 2)用图回答:
  • 打赏
  • 举报
回复
引用 1 楼 Vincent王荣光的回复:
三块内存。
首先知道,int a=1不是一个原子操作,它分为:在堆开辟一块内存空间,为内存赋值,引用这块内存。在堆开辟内存空间的时候,产生了第一块内存。然后引用的时候,在栈中开辟了一块内存,用于存放引用,这是第二块内存。当运行到int b = 1的时候,由于1已经存在于常量池中,故不再堆中开辟空间,所以只有在栈中开辟b的引用内存空间,这是第三块内存。
个人见解!
如果是in b=2呢?
MengYan89 2019-01-22
  • 打赏
  • 举报
回复
引用 6 楼 King_YSX 的回复:
[quote=引用 2 楼 qq_39936465 的回复:] 在执行 int a=1 因为1是常量,会在栈内创建变量a,然后1的值会在常量池中创建,然后在变量a 中保存指向常量池中1的地址,当执行int b=1,会在栈内开辟变量b的内存,因为1是常量,所以会在常量池中查找是否已经创建了1这个常量,如果有就直接在b引用这个地址,如果没有就创建1这个常量,并把创建的地址返回给b。a和b 都是保存的值的内存地址。
我之前网上查资料的时候,很多都是说不会在常量池中存储,您这边有相关资料可以分享一下吗[/quote] 抱歉,答的时候吧Integer与int划等号了
qq_39936465 2019-01-21
  • 打赏
  • 举报
回复
引用 6 楼 King_YSX 的回复:
[quote=引用 2 楼 qq_39936465 的回复:]
在执行 int a=1 因为1是常量,会在栈内创建变量a,然后1的值会在常量池中创建,然后在变量a 中保存指向常量池中1的地址,当执行int b=1,会在栈内开辟变量b的内存,因为1是常量,所以会在常量池中查找是否已经创建了1这个常量,如果有就直接在b引用这个地址,如果没有就创建1这个常量,并把创建的地址返回给b。a和b 都是保存的值的内存地址。

我之前网上查资料的时候,很多都是说不会在常量池中存储,您这边有相关资料可以分享一下吗[/quote]

我前面说的可能不是太规范,变量由3部分组成,变量类型,变量名,变量值。变量的类型和变量名会存储在栈的变量空间中,

class常量池

我们写的每一个Java类被编译后,就会形成一份class文件;class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池(constant pool table),用于存放编译器生成的各种字面量(Literal)和符号引用(Symbolic References);每个class文件都有一个class常量池。

字面量包括:1.文本字符串 2.八种基本类型的值 3.被声明为final的常量等;
符号引用包括:1.类和方法的全限定名 2.字段的名称和描述符 3.方法的名称和描述符。

详细的请参考下面的链接

https://blog.csdn.net/zm13007310400/article/details/77534349
King_YSX 2019-01-21
  • 打赏
  • 举报
回复
引用 2 楼 qq_39936465 的回复:
在执行 int a=1 因为1是常量,会在栈内创建变量a,然后1的值会在常量池中创建,然后在变量a 中保存指向常量池中1的地址,当执行int b=1,会在栈内开辟变量b的内存,因为1是常量,所以会在常量池中查找是否已经创建了1这个常量,如果有就直接在b引用这个地址,如果没有就创建1这个常量,并把创建的地址返回给b。a和b 都是保存的值的内存地址。
我之前网上查资料的时候,很多都是说不会在常量池中存储,您这边有相关资料可以分享一下吗
King_YSX 2019-01-21
  • 打赏
  • 举报
回复
引用 3 楼 MengYan89 的回复:
应该是两块内存空间,就和之前的回答说的一样会在栈中创建变量a和b,而java会自己创建-128-127的常量,所以会直接指向常量池中的1,并不会为1单独开辟内存空间。
您跟二楼的意思,都是a和b在栈内存中存的是地址,地址指向常量池中存的1?是这个意思吗?
King_YSX 2019-01-21
  • 打赏
  • 举报
回复
引用 1 楼 Vincent王荣光 的回复:
三块内存。 首先知道,int a=1不是一个原子操作,它分为:在堆开辟一块内存空间,为内存赋值,引用这块内存。在堆开辟内存空间的时候,产生了第一块内存。然后引用的时候,在栈中开辟了一块内存,用于存放引用,这是第二块内存。当运行到int b = 1的时候,由于1已经存在于常量池中,故不再堆中开辟空间,所以只有在栈中开辟b的引用内存空间,这是第三块内存。 个人见解!
首先肯定是不会在堆内存中创建的,它并不是对象,而是局部基本类型变量。是在栈中还是在常量池,还需要再研究,谢谢啊
wildyy 2019-01-21
  • 打赏
  • 举报
回复
这是基本类型,开了两块内存,至于是栈中还是堆中看你在哪创建的,如果是方法中,那就在栈中,如果是对象的属性,就在堆中
stacksoverflow 2019-01-21
  • 打赏
  • 举报
回复
Java里所谓的分配内存指的是堆内存,基本数据类型的值直接放在栈中,不分配堆内存。
MengYan89 2019-01-18
  • 打赏
  • 举报
回复
应该是两块内存空间,就和之前的回答说的一样会在栈中创建变量a和b,而java会自己创建-128-127的常量,所以会直接指向常量池中的1,并不会为1单独开辟内存空间。
qq_39936465 2019-01-18
  • 打赏
  • 举报
回复
在执行 int a=1 因为1是常量,会在栈内创建变量a,然后1的值会在常量池中创建,然后在变量a 中保存指向常量池中1的地址,当执行int b=1,会在栈内开辟变量b的内存,因为1是常量,所以会在常量池中查找是否已经创建了1这个常量,如果有就直接在b引用这个地址,如果没有就创建1这个常量,并把创建的地址返回给b。a和b 都是保存的值的内存地址。
Vincent光光 2019-01-18
  • 打赏
  • 举报
回复
三块内存。
首先知道,int a=1不是一个原子操作,它分为:在堆开辟一块内存空间,为内存赋值,引用这块内存。在堆开辟内存空间的时候,产生了第一块内存。然后引用的时候,在栈中开辟了一块内存,用于存放引用,这是第二块内存。当运行到int b = 1的时候,由于1已经存在于常量池中,故不再堆中开辟空间,所以只有在栈中开辟b的引用内存空间,这是第三块内存。
个人见解!

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧