Static mode
- 存储在heap中
- 在程序执行期内 entity至多attach一个运行时对象
- Entity是指属性、参数、 局部变量和结果等在代码中的名字,其值为对象或对对象的引用
- 该技术在程序加载时或开始时一劳永逸地为所有对象分 配空间(并将它们附加到相应的实体)
- 不支持递归
- 不支持动态创建数据结构
Stack-based mode - 栈是存储方法调用和局部变量的地方。
- 如果一个方法被调用时,其栈帧将在调用堆栈的顶部。栈帧保存方法的状态,包括正在执行的代码行和所有局部变量的值。
- 栈顶部的方法始终是该堆栈的当前运行方法。
- 一个entity在运行时 可以先后attach多个对象,运行时机制以堆栈中的后进先出顺序分配和释放这 些对象。
- 当一个对象被释放时,相应的entity会再次attach到之前attached的对象 (如果有的话)。
-
Heap-based mode
▪ 将内存分为多份,每份保存 对象或未使用
▪ 也称为自由模式,可通过显式请求动态创建对象的 完全动态模式。
▪ 一个entity可先后attached任意数量的对象; 对象创建的模式 在编译时通常是不可预测的, 对象还可以包含对其他对象的引用。
▪ 支持创建复杂的动态数据结构。
选D。成员变量被分配在heap中。局部变量中基本数据类型被分配在stack中,抽象数据类型被分配在heap中。
Java Memory Model
- 对象创建在heap中
- Java支持对象的自动回收
The Internal Java Memory Model
The Internal Java Memory Model: Stack
- 每个线程有自己的栈
- 栈中包含所有方法的 局部变量
- 基本类型的局部变量保存在线程栈中
- 线程只能访问自己的线程栈
- 线程创建的局部变量其他线程不可见
- 即使两个线程的代码一样,创建的同名变量仍然在各自的栈中
- 每个线程有自己 版本的局部变量
The Internal Java Memory Model: Heap
- .一个线程 可能会将基本类型变量的副本传递给另一个线程,但它本身不能共享 基本类型局部变量。
- 对象类型数据保存在堆中
- 如果对象被指派到某个局部变量,或者作为其 他对象的成员变量,创建的对象仍然在堆中。
Garbage Collection
- GC的主要任务是 区分可达对象和不可达对象(存活对象与死亡对象)
- 静态模式中不存在内 存空间回收问题
- 动态模式(stack-based, heap-based)则需要考虑内存空间回收问题
- Heap 模式中,对象的创建在编译时未知,所以无法预测对象何时无用(可回 收)
Live objects vs. dead objects
如果一个对象是可达的,则为存活对象
Mark-Sweep: 标记-清除
- 给你**需要的对象(**根)留个便条。
- 然后递归地在活动对象需要的任何东西上放置一个注释。
- 然后,检查所有对象,并扔掉没有笔记的对象
Mark-Compact: 标记-压缩
- 把笔记放在你需要的东西上。
- 把任何有纸条的东西搬到车库后面。
- 烧掉车库前面的所有东西(都没了)。
- Mark-sweep 检查内存中各对象是 live 还是 dead,对 dead 对象做出标记,进而将其清理
Copying: 复制
- 把你需要的东西搬到一个新的车库。
- 然后递归地移动新车库中对象所需的任何东西。
- 然后,烧毁旧车库(里面的任何东西都是死的)!
Reference counting分享所有权的机制
▪目标:确定你何时是唯一的所有者,这样你就可以做出处理决定。
▪基本思想:计算活动对象的引用数量。
-每个对象都有一个引用计数(RC)
-当一个引用被复制时,被引用的RC会增加
-当一个引用被删除时,被引用的RC会减少
-当它的RC = 0时,一个对象可以被回收
Recursive freeing 递归释放
- 一旦一个对象的RC=0,它就可以被释放。
- 但是对象可能包含对其他对象的引用。
- 在释放此对象之前,还应该释放其组成部分的RCs。