Ruby中的内存模型

mrg*_*mrg 5 ruby memory memory-management ruby-on-rails memory-model

如何在ruby中管理内存.对于Ex:如果我们在执行期间采用C程序,则以下是内存模型.与此类似,如何在ruby中处理内存.

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

Ruby: 

              ?
Run Code Online (Sandbox Code Playgroud)

Jör*_*tag 8

Ruby中没有"内存"这样的东西.

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

分配该对象的位置,分配方式,如果它在内存中保持相同位置或四处移动,则不会指定或观察到该对象.例如,在MagLev上,对象实际上可能根本不在内存中分配,而是在磁盘上或在另一台计算机的内存中.JRuby中,IronRuby的,欧泊,红衣主教的MacRuby等"外包"出去的内存管理给第三方,他们从字面上甚至不知道发生了什么,以他们的记忆.

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

注意:该ObjectSpace模块允许对对象空间进行有限量的内省和反射.一般来说,当我说Ruby中的某些内容"不可能"时,总会有一个隐含的警告"除非你使用反射".但是,即使ObjectSpace不泄漏有关内存组织的任何信息.

在YARV中,还有objspace库和GC模块,它们提供有关YARV的内部实现细节.但是,它们是YARV的私有内部实现细节,甚至不保证在其他实现中存在,并且它们可能随时更改,甚至在YARV内也不会发出通知.

您可能会注意到我没有写任何关于垃圾收集的内容!嗯,实际上,Ruby只指定何时引用对象以及何时引用对象.如何处理未引用的对象,它没有说.对于实现来回收这些未引用对象所使用的空间是有意义的,并且它们都在某种程度上有效(例如,旧版本的YARV不会回收未引用Symbol的对象),但它不是必需的也不是指定的.所有实现都使用非常不同的方法.同样,JRuby,IronRuby,Opal,Cardinal,MacRuby,Topaz,MagLev等将该问题"外包"到底层平台,Rubinius使用基于Immix收集器的分代,复制,移动,跟踪收集器,YARV使用简单标记和扫描跟踪收集器.