【问题标题】:Memory Model in RubyRuby 中的内存模型
【发布时间】:2016-07-04 11:52:39
【问题描述】:

如何在 ruby​​ 中管理内存。例如:如果我们在执行过程中拿C程序,下面是内存模型。与此类似 ruby 中如何处理内存。

  C:
                       __________________
                        |                |
                        |      stack     |
                        |                |
                        ------------------
                        |                |
                        |   <Un Allocated|
                        |       space>   |
                        ------------------
                        |                |
                        |                |
                        |       Heap     |
                        |                |
                        |                |
                        __________________
                        |                |
                        |       data     |
                        __________________
                        |       text     |
                        __________________

Ruby: 

              ?

【问题讨论】:

  • Ruby 程序看不到这样的东西。所有这些都由解释器抽象出来。
  • @undur_gongor 至少有任何概念图?
  • 一个标有“内存”的盒子?

标签: ruby-on-rails ruby memory memory-management memory-model


【解决方案1】:

Ruby 中没有“内存”这种东西。

Class#allocate 分配一个对象并返回该对象。这就是程序员可以与对象空间子系统进行交互的全部范围。

该对象的分配位置、分配方式、它是否在内存中的相同位置或四处移动,这些都没有被指定或观察到。例如,在 MagLev 上,一个对象实际上可能根本没有分配在内存中,而是在磁盘上,或者在另一台计算机的内存中。 JRuby、IronRuby、Opal、Cardinal、MacRuby 等将他们的内存管理“外包”给第三方,他们字面意思甚至不知道他们的内存发生了什么。

Ruby 实现可能使用单独的堆栈和堆,它可能使用堆分配的堆栈,甚至可能根本不使用堆栈(例如 Cardinal)。

注意:ObjectSpace 模块允许对对象空间进行有限的自省和反射。一般来说,当我说某些事情在 Ruby 中是“不可能的”时,总会有一个隐含的警告“除非你使用反射”。然而,即使ObjectSpace 也不会泄露任何有关内存组织的信息。

在 YARV 中,还有 objspace 库和 GC 模块,它们提供了有关 YARV 的内部实现细节。但是,它们是 YARV 的私有内部实现细节,它们甚至不保证存在于其他实现中,并且它们可能随时更改,即使在 YARV 内部也是如此。

你可能会注意到我没有写任何关于垃圾收集的文章!好吧,实际上,Ruby 只指定对象何时被引用,何时不被引用。 如何处理未引用的对象,它没有说。回收那些未引用对象所使用的空间对于实现来说是有意义的,并且它们都在某种程度上这样做(例如,旧版本的 YARV 不会回收未引用的Symbols),但这不是必需的,也不是指定的。并且所有实现都使用非常不同的方法。再次,JRuby、IronRuby、Opal、Cardinal、MacRuby、Topaz、MagLev 等将问题“外包”给底层平台,Rubinius 使用基于 Immix 收集器的分代、复制、移动、跟踪收集器,YARV 使用简单标记- 并扫描跟踪收集器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 2010-11-06
    • 2012-01-07
    • 2011-02-28
    相关资源
    最近更新 更多