堆栈
- 栈:栈内存是为线程留出的临时空间,每个线程都有一个固定大小的栈空间,而且栈空间存储的数据只能由当前线程访问,所以它是线程安全的。
栈空间的分配和回收是由系统来做的,我们不需要手动控制。
- 堆:new出来的实际空间是在堆上分配,然后在栈上开辟一个指针大小的空间,这个空间有一个指针,指向堆上的那块内存,这样给变量和堆内存之间就关联起来了。
| 栈 | 堆 | |
|---|---|---|
| 速度 | 快 | 慢 |
| 空间管理 | 高效,不会产生碎片 | 会产生内存碎片 |
| 访问权限 | 只能局部变量 | 可以访问全局变量 |
| 空间大小限制 | 操作系统限制 | 没有特定的限制 |
| 内存分配 | 连续 | 随机分配 |
| 分配和释放 | 编译器指令自动管理 | 程序员手动管理 |
| 开销 | 低 | 高 |
| 主要问题 | 空间小 | 内存碎片 |
| 灵活性 | 固定大小 | 可以resize |
