堆与栈

来源:互联网 发布:云计算课程大纲 编辑:程序博客网 时间:2024/06/05 12:43

栈与堆是两个内存区域:

栈是一串向低地址扩展连续的内存空间,而堆则是向高地址扩展的链式的存储的。

在c语言中,栈是由计算机自动分配运行的,而堆则是由程序开发者进行应运用分配与及释放,当函数运行执行时,栈空间加入引用;这里需要提示一点,定义char* p = (char*)malloc(sizeof(char));时,p指针存在于栈中,而分配的由p指针指向的分配好的空间则存在于堆中。这里需要说明下,sizeof属于一个运算符。

在程序运行的时候,如果发生了内存申请,则会首先遍历堆,找到一个比所申请的内存大的一个节点,然后将它从该链表中删除,在该节点存储完成后剩余的空间,将会重新加入到对链表中去。

在函数开始运行时,首先是指令入栈,其次是函数的参数由右至左入栈,再到局部变量,函数运行完后,首先是局部变量出栈,再然后是参数出栈,最后栈顶指针指向最开始的位置。

然后对于java虚拟机中的内存情况,一般在java中说的堆和栈就是指的虚拟机栈与GC堆,虚拟机栈分为局部变量区,操作数栈,动态连接,方法出口等等。重点说下局部变量区,局部变量区主要存储的是基本数据类型,对象引用与及指向字节码地址的returnAdress类型。当内存不够或则无法扩展就会抛异常。然后GC堆是存储不会发生逃逸的对象。里面分为新生代和老年代,对象消失很频繁,那些被保留下来的或则年龄超过15的进入老年代区域。然后不会发生逃逸的对象将被存入虚拟机栈中,随着方法的完毕而被消亡。对于java中的栈与及堆,都不用开发者去操作,建一个对象只需new就可以让堆中增加一个对象,然后对象的消亡,虚拟机会定时检测,如果该对象不在被使用,则将其销毁,这样有效的防止了c中有可能发生的内存泄漏。然后再简单说下直接内存与堆的比较,直接内存中对象的申请较慢,而堆中对象的访问较慢,各有优点。

堆与栈就是程序运行时,内存的支持。

0 1
原创粉丝点击