如何在
ruby中管理内存.对于Ex:如果我们在执行期间采用C程序,则以下是内存模型.与此类似
如何在ruby中处理内存.
如何在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使用简单标记和扫描跟踪收集器.