如何在红宝石中管理内存。对于Ex:如果我们在执行过程中使用C程序,下面是内存模型。与此类似,内存是如何在红宝石中处理的。
C:
__________________
| |
| stack |
| |
------------------
| |
| <Un Allocated|
| space> |
------------------
| |
| |
| Heap |
| |
| |
__________________
| |
| data |
__________________
| text |
__________________
Ruby:
?发布于 2016-07-04 12:34:35
在Ruby中没有“内存”这样的东西。
Class#allocate分配一个对象并返回该对象。这就是程序员与对象空间子系统之间的全部交互程度。
在分配对象的地方,如何分配对象,如果它停留在内存中的同一个位置,或者在内存中移动,那么所有这些都不会被指定或观察到。例如,在MagLev上,对象实际上可能根本不在内存中分配,而是在磁盘上分配,或者在另一台计算机的内存中分配。JRuby,IronRuby,Opal,红衣主教,MacRuby等等,把他们的内存管理“外包”给第三方,他们甚至不知道他们的记忆发生了什么。
Ruby实现可以使用单独的堆栈和堆,也可以使用堆分配的堆栈,甚至可以根本不使用堆栈(例如红衣主教)。
注意:ObjectSpace模块允许对对象空间进行有限的内省和反射。一般来说,当我在Ruby中说某事是“不可能的”时,总是有一个隐含的警告“除非你使用反射”。但是,即使是ObjectSpace也不会泄漏任何有关内存组织的信息。
在YARV中,还有objspace库和GC模块,它们提供了有关YARV的内部实现细节。但是,它们是YARV的私有内部实现细节,它们甚至不能保证在其他实现中存在,即使在YARV中,它们也可以在没有通知的情况下随时更改。
您可能会注意到,我没有写任何关于垃圾收集的文章!实际上,Ruby只指定什么时候引用对象,什么时候没有引用对象,它没有说明如何处理未引用对象。实现回收那些未引用对象所使用的空间是有意义的,而且所有这些对象都在一定程度上这样做(例如,较早版本的YARV不会回收未引用的Symbols),但它并不是必需的,也不是指定的。所有的实现都使用非常不同的方法。同样,JRuby、IronRuby、Opal、红衣主教、MacRuby、Topaz、MagLev等将这个问题“外包”给底层平台,Rubinius使用了基于Immix收集器的分代复制、移动、跟踪收集器,YARV使用了一个简单的标记和扫描跟踪收集器。
https://stackoverflow.com/questions/38184093
复制相似问题