gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:13:22 25 4
gpt4 key购买 nike

ruby 如何管理内存。例如:如果我们在执行过程中采用 C 程序,则以下是内存模型。类似于这个ruby 如何处理内存。

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

Ruby:

?

最佳答案

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

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

那个对象是在哪里分配的,它是如何分配的,如果它停留在内存中的同一个地方或四处移动,这些都没有指定或可观察到。例如,在 MagLev 上,一个对象实际上可能根本不在内存中分配,而是在磁盘上,或者在另一台计算机的内存中。 JRuby、IronRuby、Opal、Cardinal、MacRuby 等将他们的内存管理“外包”给第三方,他们字面上甚至不知道他们的内存发生了什么。

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

注:ObjectSpace模块允许对对象空间进行有限的内省(introspection)和反射。一般来说,当我说某些事情在 Ruby 中是“不可能的”时,总是有一个隐含的警告“除非你使用反射”。然而,即使是 ObjectSpace 也不会泄露任何关于内存组织的信息。

在 YARV 中,还有 objspace图书馆和 GC模块,它提供有关 YARV 的内部实现细节。然而,它们是 YARV 私有(private)的内部实现细节,甚至不能保证它们存在于其他实现中,并且即使在 YARV 中它们也可能随时更改,恕不另行通知。

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

关于ruby-on-rails - Ruby 中的内存模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38184093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com