2019-1-07 栈和堆的区别

1:有正当理由需要更多堆栈的程序很少。另一方面,程序员的错误是很常见的,有时这些错误会导致代码陷入无限循环。如果这个无限循环恰好包含一个递归函数调用,那么堆栈将很快耗尽所有可用内存。堆栈大小的软限制防止了这种情况:程序将崩溃,但OS的其他部分不会受到影响。

2:栈和堆都是在内存里面,栈的大小可能没有很大,这样就可能需要堆了。堆在一个函数内部跳出之后,还可以保存原来的值,问题是,申请之后,你要释放。

 

转自http://bbs.csdn.net/topics/390840859

 

  要问Java为什么要堆栈,那就要问C为什么要堆栈,问C为什么要堆栈就要问以前写汇编的为什么写着写着就喜欢把内存分两块来用,至于这个问题你跑去C板块和汇编板块估计都没几个人能让你信服地说清楚原因。

       首先汇编里,变量的概念几乎没有了,有的只是各种内存地址,不管是实地址还是虚地址,你访问一个变量就是靠地址,所以如果你不记住一个变量的地址,你就没办法去操作它,这就产生了问题,如果你的程序要1000个变量,你就把他们的地址全记下来吗?这显然是不现实的,首先这会浪费很多空间,因为几乎任何操作都离不开操作变量,也就是地址,那么就相当于你要用两倍甚至更多的空间来表示你的程序,而一半浪费在地址上,其次这样写程序也是没有效率的,1000个变量,难道你能把他们的地址全背下来吗?或者说当你看到地址0x1234的值赋值给地址0x2345时,你如何记得起0x1234和0x2345是两个干什么用的变量?
       所以以一种系统的方法管理内存就显得尤为重要,毕竟我们要用计算机来方便自己,而不是拿来自虐。经过很多人的摸索,人们发现变量主要是两种形式,一种内容短小(比如一个int整数),需要频繁访问,但是生命周期很短,通常只在一个方法内存活,而另一种内容可能很多(比如很长一个字符串),可能不需要太频繁的访问,但生命周期较长,通常很多个方法中可能都要用到,那么自然将这两类变量分开就显得比较理性,一类存储在栈区,通常是局部变量、操作符栈、函数参数传递和返回值,另一类存储在堆区,通常是较大的结构体(或者OOP中的对象)、需要反复访问的全局变量。
堆区就是各种慢,申请内存慢,访问慢,修改慢,释放慢,整理慢(或者说GC垃圾回收),但优点也不言而喻,访问随机灵活,空间超大,在不超可用内存的情况下你要多大就给多大。
       栈区就像临时工,干完就跑,所以超快,但是缺点也很多,比如生命周期短,一般只能在一个方法内存活,又比如你需要事先知道需要多大的栈(事实上绝大多数语言栈区要分配的大小编译期就确定了,Java就是这样),而且通常最大栈区可用内存都很小,你不可能往栈区里堆很多数据。

你可能感兴趣的:(2019-1-07 栈和堆的区别)