加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 23:17:48 所属栏目:百科 来源:网络整理
导读:如何在 ruby中管理内存.对于Ex:如果我们在执行期间采用C程序,则以下是内存模型.与此类似 如何在ruby中处理内存. C: __________________ | | | stack | | | ------------------ | | | Un Allocated| | space | ------------------ | | | | | Heap | | | | |
如何在 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使用简单标记和扫描跟踪收集器.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读