通过字符串创建来理解Java堆和栈的概念

一、概念

在这里插入图片描述
在这里插入图片描述
Java程序经编译后是运行在JVM虚拟机上的,因此Java程序内存分配是在JVM虚拟机内存分配机制下完成。

JAVA在程序运行时,在内存中划分5片空间进行数据的存储。分别是:1:寄存器。2:本地方法区。3:方法区。4:栈。5:堆。

堆内存

堆内存是java内存中的一种,它的作用是用于存储java中的对象和数组,当我们new一个对象或者创建一个数组的时候,就会在堆内存中开辟一段空间给它,用于存放。
通常说的堆一般指java内存模型中的堆,用于储存对象实例和数组,几乎所有的对象实例都会存储在堆中分配。java堆是java虚拟机管理的内存中最大的一块,也被称为 “GC堆”,是垃圾收集器管理的主要区域。
堆内存的特点是什么?
第一点:堆其实可以类似的看做是管道,或者说是平时去排队买票的情况差不多,所以堆内存的特点就是:先进先出,后进后出,也就是你先排队好,你先买票。
第二点:堆可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,但缺点是,由于要在运行时动态分配内存,存取速度较慢。
new对象在堆中如何分配?
由Java虚拟机的自动垃圾回收器来管理。

栈内存

什么是栈内存
通常说的栈一般指栈帧中的局部变量表(存放的8种类型: byte、short、int、long、float、double、char、boolean和reference、returnAddress),它是一片连续的内存空间,用来存放方法参数,以及方法内定义的局部变量,存放着编译期间已知的数据类型。局部变量表所需要的内存空间在编译期完成分配,当进入一个方法时,这个方法在栈中需要分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表大小。
栈内存是Java的另一种内存,主要是用来执行程序用的,比如:基本类型的变量和对象的引用变量
栈内存的特点
第一点:栈内存就好像一个矿泉水瓶,往里面放入东西,那马先放入的沉入底部,所以它的特点是:先进后出,后进先出
第二点:存取速度比堆要快,仅次于寄存器,栈数据可以共享,但缺点是,存在栈中的数据大小与生存必须是确定的,缺乏灵活性
栈内存分配机制
栈内存可以称为一级缓存,由垃圾回收器自动回收
数据共享

堆内存与栈内存的区别

  1. 共享性不同:栈内存是线程私有的,其存储的变量只能在所属线程中可见。堆内存是线程共有的,堆内存中的对象可以被随偶线程访问。
  2. 速率不同:栈内存由系统分配,存取速度速度较快,仅次于CPU中的寄存器。缺点是存在栈中的数据大小与生存期必须确定的,缺少灵活性。堆的优势在于可以动态的分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走不再使用的数据。缺点是运行时动态分配内存,存取速度慢。
  3. 空间大小及限制 :栈的内存大小在编译时确定,是一段连续的空间,运行时不会改变,栈内存随线程的结束自动回收。如果请求的栈的深度大于虚拟机允许的栈深度,JVM会抛出java.lang.StackOverFlowError。
    堆内存在程序运行时动态分配,可以是存在物理上不连续的内存空间,线程运行结束后GC进行回收(只有对象或数组不再被引用时才回收)。如果是堆内存没有可用的空间存储生成的对象,JVM会抛出java.lang.OutOfMemoryError。
  4. 栈(stack):是一个先进后出的数据结构,通常用于保存方法(函数)中的参数,局部变量.
    在java中,所有
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值