堆内存和栈内存

引用链接:https://blog.csdn.net/WWK0905/article/details/110637233

JVM把内存划分成两种:一种是栈内存,一种是堆内存。

在函数中定义的一些基本类型的变量对象的引用变量(变量名)都在函数的栈内存中分配
当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间超过变量的作用域,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用
堆内存用来存放由new创建的对象(包括由基本类型包装起来的类:Integer、String、Double,实际上每个基本类型都有他的包装类)和数组

new 创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)。一个对象引用可以指向 0 个或 1 个对象(一根绳子可以不系气球,也可以系一个气球);一个对象可以有 n 个引用指向它(可以用 n 条绳子系住一个气球)。

String str1= “abc” ;可以理解String作为基本数据类型使用。在编译阶段,JVM会去常量池来查找是否存在abc,如果不存在,就在常量池中开辟一个空间来存储abc;如果存在,就不用新开辟空间。然后在栈内存中开辟一个名字为str1的变量,来存储abc在常量池中的地址值。

String str2 = new String(“abc”) ;可以理解String作为引用数据类型使用。在编译阶段,JVM先去常量池中查找是否存在abc,如果不存在,则在常量池中开辟一个空间存储abc。在运行时期,通过String类的构造器在堆内存中new了一个空间,然后将String池中的abc复制一份存放到该堆空间中,在栈中开辟名字为str2的变量,存放堆中new出来的这个String对象的地址值。

也就是说,前者在初始化的时候可能创建了一个对象,也可能一个对象也没有创建;后者因为new关键字,至少在内存中创建了一个对象,也有可能是两个对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值