栈:每个线程都有一个栈(栈帧),栈里包含main方法和其他main方法调用的其他方法,方法调用完后,自动释放——弹出栈(栈顶指针向下)。
堆:包含新建的对象的详细信息。需要手动释放
最难调试的bug:
- 野指针
同一个对象,两个指针,一个释放了,另外一个不知道还拿来用
同一个指针,不同位置,
不在指向任何对象的指针
NullPionterExcepetion
-
并发问题
多线程访问同一块空间。
:
语言的发展历史
C/C++
- 手工管理 malloc free/new delete
- 忘记释放 - memory leak- out of memory
- 释放多次 产生极其i难以调试的bug,一个线程空间莫名其妙被释放
- 运行效率高,开发效率低。
Java python go
- 方便内存管理的语言
- GC—Garbage Collector —应用线程只管分配,垃圾回收器负责回收
rust
- 运行效率超高(asm c c++)
- 不用手工管理内存(没有GC)
- 学习曲线巨高
判断堆里面的对象是否是garbage
-
简答思想:
每个变量都有一个计数器,记录指向其的指针数,(不好)python引用计数法
-
java使用根可达**(Root Searching)**算法
垃圾回收机制:
- Mark Sweep(标记清除)缺点:碎片化
- Copying :只用一半的空间,垃圾回收时,把用过的一半中有效的内存整理好放进另一半里,之前的一半完全重置。(内存浪费)
- Mark Compact(),使用整块内存,回收垃圾时整理有用的部分,清除其余部分。效率低,三种最低。
对这三种算法的综合运用,诞生了各种各样的垃圾回收器。



