学java总是遇到堆和栈的问题:
以下为我对堆和栈的理解
答案一
1)栈内存和堆内存的概念(基于JAVA)
区别:
栈内存(直接分配内存,有固定大小)和 堆内存(需要手动分配,无固定大小);
https://blog.csdn.net/xdd19910505/article/details/41900693
引用访问:
Book book=null;声明了一个对象的栈区空间
new Book([参数1][参数2]....) ; 在jvm的堆内存 就有有了一个块空间;
book =new Book(...) ; 把内存地址给栈内存
答案二
-
和堆一样存储在计算机 RAM 中。
-
在栈上创建变量的时候会扩展,并且会自动回收。
-
相比堆而言在栈上分配要快的多。
-
用数据结构中的栈实现。
-
存储局部数据,返回地址,用做参数传递。
-
当用栈过多时可导致栈溢出(无穷次(大量的)的递归调用,或者大量的内存分配)。
-
在栈上的数据可以直接访问(不是非要使用指针访问)。
-
如果你在编译之前精确的知道你需要分配数据的大小并且不是太大的时候,可以使用栈。
-
当你程序启动时决定栈的容量上限。
Heap:
-
和栈一样存储在计算机RAM。
-
在堆上的变量必须要手动释放,不存在作用域的问题。数据可用 delete, delete[] 或者 free 来释放。
-
相比在栈上分配内存要慢。
-
通过程序按需分配。
-
大量的分配和释放可造成内存碎片。
-
在 C++ 中,在堆上创建数的据使用指针访问,用 new 或者 malloc 分配内存。
-
如果申请的缓冲区过大的话,可能申请失败。
-
在运行期间你不知道会需要多大的数据或者你需要分配大量的内存的时候,建议你使用堆。
-
可能造成内存泄露。