堆栈

stack这个词,它的中文名字叫做"栈"

含义一:stack的第一种含义是一组数据的存放方式

含义二:代码运行方式

含义三:内存区域。一般来说,系统会划分出两种不同的内存空间:一种叫做stack(栈),另一种叫做heap(堆)。

区别是:stack是有结构的,每个区块按照一定次序存放,可以明确知道每个区块的大小;heap是没有结构的,数据可以任意存放。因此,stack的寻址速度要快于heap。

每个线程分配一个stack,每个进程分配一个heap,stack是线程独占的,heap是线程共用的。stack创建的时候,大小是确定的,数据超过这个大小,就发生stack overflow错误,heap的大小是不确定的,需要的话可以不断增加。

根据上面这些区别,数据存放的规则是:只要是局部的、占用空间确定的数据,一般都存放在stack里面,否则就放在heap里面。

public void Method1()

{

    int i=4;

    int y=2;

    class1 cls1 = new class1();

}

上面代码的Method1方法,共包含了三个变量:i, y 和 cls1。其中,i和y的值是整数,内存占用空间是确定的,而且是局部变量,只用在Method1区块之内,不会用于区块之外。cls1也是局部变量,但是类型为指针变量,指向一个对象的实例。指针变量占用的大小是确定的,但是对象实例以目前的信息无法确知所占用的内存空间大小。

i、y和cls1都存放在stack,因为它们占用内存空间都是确定的,而且本身也属于局部变量。但是,cls1指向的对象实例存放在heap,因为它的大小不确定。作为一条规则可以记住,所有的对象都存放在heap。

接下来的问题是,当Method1方法运行结束,会发生什么事?

回答是整个stack被清空,i、y和cls1这三个变量消失,因为它们是局部变量,区块一旦运行结束,就没必要再存在了。而heap之中的那个对象实例继续存在,直到系统的垃圾清理机制(garbage collector)将这块内存回收。因此,一般来说,内存泄漏都发生在heap,即某些内存空间不再被使用了,却因为种种原因,没有被系统回收。

参考:http://www.ruanyifeng.com/blog/2013/11/stack.html

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register)。 这是最快的存储区,因为它位...
    辰321阅读 487评论 0 0
  • 浅谈堆栈理解 Objective-C的对象在内存中是以堆的方式分配空间的,并且堆内存是由你释放的,即release...
    五八四十阅读 4,720评论 0 10
  • 文章摘录地址:http://www.cnblogs.com/iliuyuet/p/5603618.html 1.栈...
    蘑菇姐夫阅读 1,090评论 0 5
  • 参考地址:http://soft.chinabyte.com/database/407/11319907.shtm...
    YangEvol阅读 1,671评论 0 1
  • 文/墨小辰 蝉没命的嘶鸣,天热得让人心慌。 凉镇好多年没遇见过这么热的天了,老人们都说,这是当今人们违...
    种花哥哥阅读 692评论 7 15

友情链接更多精彩内容