栈与堆栈的区别

   任何软件在运行时都要在内存中开辟空间,Java虚拟机运行时也是要开辟空间的。JVM运行时在内存中开辟一片内存区域,启动时在自己的内存区域中进行更细致的划分,因为虚拟机中每一片内存处理的方式都不同,所以要单独进行管理。

      JVM内存的划分有五片:

       1.   寄存器;

       2.   本地方法区;

       3.   方法区;

       4.   栈内存;

       5.   堆内存。

 

 栈内存:栈内存首先是一片内存区域,存储的都是局部变量,凡是定义在方法中的都是局部变量(方法外的是全局变量),是先加载函数才能进行局部变量的定义,所以方法先进栈,然后再定义变量,变量有自己的作用域,一旦离开作用域,变量就会被释放。栈内存的更新速度很快,因为局部变量的生命周期都很短。

       堆内存:存储的是数组和对象,凡是new建立的都是在堆中,堆中存放的都是实体,实体用于封装数据,而且是封装多个(实体的多个属性),如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的,但是栈不一样,栈里存放的都是单个变量,变量被释放了,那就没有了。堆里的实体虽然不会被释放,但是会被当成垃圾,Java有垃圾回收机制不定时的收取。

 

队列先进先出,在队头做删除操作,在队尾做插入操作。

栈先进后出,在栈顶做插入和删除操作。

堆和它们不同,不存在是先进后出还是先进先出。

 

1. 栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FILO的特性,在编译的时候可以指定需要的Stack的大小。在编程中,例如C/C++中,所有的局部变量都是从栈中分配内存空间,实际上也不是什么分配,只是从栈顶向上用就行,在退出函数的时候,只是修改栈指针就可以把栈中的内容销毁,所以速度最快。 

 

2. 堆(Heap)是应用程序在运行的时候请求操作系统分配给自己内存,一般是申请/给予的过程,C/C++分别用malloc/New请求分配Heap,用free/delete销毁内存。由于从操作系统管理的内存分配所以在分配和销毁时都要占用时间,所以用堆的效率低的多!但是堆的好处是可以做的很大,C/C++对分配的Heap是不初始化的。 

 

3. 在Java中除了基本类型都是在堆中分配内存,这也是程序慢的一个主要原因。但是跟C/C++不同,Java中分配Heap内存是自动初始化的。在Java中所有的对象都是在堆中分配的,但是这个对象的引用却是在Stack中分配。也就是说在建立一个对象时从两个地方都分配内存,在Heap中分配的内存实际建立这个对象,而在Stack中分配的内存只是一个指向这个堆对象的指针(引用)而已。

 

4. 堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。堆是指程序运行时申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。

 

5.栈是先进后出的,但是对于堆而言却没有这个特性,两者都是存放临时数据的地方。 对于堆,我们可以随心所欲的进行增加变量和删除变量,不需要遵循什么次序。

 

从变量存储方面来看堆和栈的区别:

程序的局部变量存在于栈中,全局变量存在于静态区中,动态申请数据存在于堆中;

这样说比较准确,所谓的栈其实是由寄存器ebp和esp指向的一片内存空间(ebp指向栈底,esp指向栈顶),原则上是由高地址向低地址生长的一片空间,会保存一些临时的数据,比如一个函数中的临时变量以及返回地址,数据的出入是先进后出,后进先出。全局变量实际上是存在一个可读可写的内存空间,这个空间是在你写程序编译好的空间地址(由编译器决定),是固定的。

堆是由操作系统管理的一片空间,事先是没有在进程空间里分配的,一般是由程序动态的分配出来的。

堆,用于保存new 和malloc这些自定义的内存变量;

全局静态区用于保存全局变量和静态变量;

字符常量区,用于保存字符串;

代码区,用于保存程序的二进制代码;

 

 栈内存存储的是局部变量而堆内存存储的是实体;

 栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;

  栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用和引用的内容,(Stack)和堆(Heap)是两个不同的概念。是操作系统在建立进程或线程时为其分配的存储区域,具有FIFO(先进先出)的特性,用于存储局部变量和函数调用的相关信息。而堆是应用程序在运行时向操作系统请求分配的内存空间,用于存储动态分配的数据。 根据引用和引用的内容,(Stack)和堆(Heap)的存储内容也是不同的。在中,函数调用时首先进的是下一条指令的地址,然后是参数和局部变量。在函数调用结束后,会依次出,恢复到函数调用之前的状态。而堆中的存储内容由程序员自行安排,一般用于存储动态分配的数据。堆中的具体内容是由程序员控制的,通常在堆的头部存放堆的大小。 根据引用的内容,堆和的使用示例可以更好地说明它们之间的区别。在这个示例中,全局初始化区和全局未初始化区用于存储全局变量,用于存储局部变量和函数参数,堆用于存储通过动态分配得到的内存空间。在这个示例中,p1和p2指向的内存空间是通过malloc函数在堆中分配得到的,而p3指向的字符串是存储在常量区的。 综上所述,和堆是两个不同的概念。是操作系统为进程或线程分配的存储区域,用于存储局部变量和函数调用的相关信息;而堆是应用程序在运行时向操作系统请求分配的内存空间,用于存储动态分配的数据。它们的存储内容和使用方式也是不同的。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [堆、堆栈区别(总结)](https://blog.csdn.net/Britripe/article/details/117083092)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值