内存区域结构:
Memory
------------------
| Heap |
|------------------|
| Stack |
|------------------|
| Static Variables|
|------------------|
| Code |
|------------------|
堆区与栈区:
堆区是用户自己创建的内存空间,例如使用C++里的malloc,如果使用完不手动释放,容易发生内存泄漏。栈是系统给开发人员自动分配的空间,在运行结束后,也会自动释放。
Call stack 调用栈,英文直接简称“the stack”,别称为运行时栈(run-time stack),执行栈(execution stack),控制栈(control stack)与机器栈(machine stack)。是计算机科学中存储系统正在运行的子程序消息的栈,几乎所有的计算机程序都依赖于调用栈,而高级语言一般把调用栈的信息隐藏至后台。在调用栈中,压入的一组数据称为一个stack frame,一个stack frame包括一个函数和它的参数。
堆的空间要远远大于栈,开发人员可以分配的最大的堆的大小就是系统的内存,但是对于栈来说,64位的Windows最大的栈的大小是1MB,Linux系统是10MB。
引用数据类型往往在栈中存储指针,该指针指向堆中该实体的起始地址。
深拷贝与浅拷贝:
这个概念只针对Object和Array这样的引用数据类型,浅拷贝只复制了指针,而不复制对象本身,新旧对象还是共享同一块内存,对新对象的修改会影响旧对象的值。深拷贝会创造一个一模一样的对象,新对象与原来的对象不共享内存,二者之间没有任何关系,对新对象的修改不会影响旧对象。