ruby-on-rails – Ruby中的内存模型

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – Ruby中的内存模型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如何在 ruby中管理内存.对于Ex:如果我们在执行期间采用C程序,则以下是内存模型.与此类似
如何在ruby中处理内存.
C:
                       __________________
                        |                |
                        |      stack     |
                        |                |
                        ------------------
                        |                |
                        |   <Un Allocated|
                        |       space>   |
                        ------------------
                        |                |
                        |                |
                        |       Heap     |
                        |                |
                        |                |
                        __________________
                        |                |
                        |       data     |
                        __________________
                        |       text     |
                        __________________

Ruby: 

              ?

解决方法

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

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

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

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

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

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

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

猜你在找的Ruby相关文章