Memory Allocation

本文探讨了Java内存的三个模式:静态、栈基和堆基。静态模式在程序启动时分配所有对象,不支持递归和动态数据结构。栈基模式中,方法调用和局部变量在栈上,对象按后进先出原则分配和释放。堆基模式支持动态创建复杂数据结构,但需要考虑垃圾回收。Java内存模型中,每个线程有自己的栈,对象在堆中创建并由垃圾收集器自动回收。垃圾回收包括标记-清除、标记-压缩和复制等策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值