Ruby垃圾收集深潜水:GC :: Internal_Constants

2021-03-27 09:55:17

有一句古老的说,我们可以通过看着他们的垃圾来学习很多人。同样可以对编程语言保持真实。更精确地,我们可以通过查看其垃圾收集来学习很多关于编程语言。这篇文章踢了一系列关于Ruby的GC的帖子(并最终是一本书)。

在这里继续(受到宾激般的不是很棒的)隐喻,我们将首先查看ruby垃圾的始终是什么。 Ruby公开GC :: Internal_Constants,因此我们可以看到垃圾收集器中的常量是什么。

我们将通过这些常数逐一地进行,并在定义它们时,了解Ruby如何组织内存的更多信息。

如上:调试常量对于调试编写Ruby源代码比写Ruby程序更有用。我们运行的每个Ruby程序都有:debug =>假装,所以我们不必担心它!

对于极其好奇的,唯一的方法:debug是true是,如果我们用cppflag设置dgc_debug到true编译红宝石源代码(参见此示例)。但是,由于大多数时候我们没有编译Ruby源代码,它几乎总是是假的。

首先要注意的是,所有这些常量的单位都以_size结尾为字节。所以这种常量告诉我们,每个rvalue都是40个字节。

整洁的。但是,它引起了问题,什么是rvalue? rvalue包含有关Ruby对象的基本信息。 rvalues是C结构,这些结构是Ruby对象的各种C表示的工会。

作为此信息的一部分,它们要么包含Ruby对象的实际值,或者如果值对于40字节限制,值太大,则它们包含对OS堆中的鼠标堆中的指针。

(除了小写,带有23个字符或更少的字符串都有存储在RValues内的值,而具有超过23个字符的字符串将其值存储在OS堆上。Pat Shaughneryy有一个有趣的博客文化解释了这种细微博语。)

好的,接下来,heap_page_obj_limit。 409是每个堆叠的最大对象数。但是一堆堆,什么是页面?

Ruby Heap是Ruby的整个对象空间或内存。这是我们所有的rvalues住在哪里。堆被分段为页面。当垃圾收集器需要更多内存时,它不会向操作系统中对每个对象索请求新内存。正如我们上面了解的RVALUE_SIZE所学到的那样,这意味着在40个字节段中请求更多的内存,这将是非常效率的。

相反,当堆需要更多内存时,它会要求整个新页面。这些页面每个页面最多包含409个对象。某些页面包含略低于409个对象; Aaron Patterson有一个伟大的博客文章,解释了原因。但是,正如这种常量告诉我们,409是每页对象(或rvalues)的上限。

我们现在知道堆和页面,但是什么是位图?嗯,每个Heap_page还具有位图中其对象的表示。每个对象都由一位表示。

好的,所以这个位图占用了56个字节的内存。这里的数学检查出来。字节中有8位。这意味着我们的56字节我们可以访问56 * 8 == 448对象,这将安全地涵盖我们想要代表的所有409个对象。

但是,我仍然没有回答为什么我们需要这些位图以代表所有对象首先代表所有对象。这与实际算法Ruby用于垃圾收集的算法是一体的。这是一个三色标记和扫描算法。该算法的细节值得他们自己的整个博客帖子中的至少一个。 (当我写的时候,我会在这里将它链接。)现在,您只需相信它是每个页面存在的重要此位图,并且页面内的每个对象都有足够的空间。

我必须承认,这个难过我。所以我搜索了Ruby源代码,发现它设置为4,但绝对没有使用变量本身。据我所知,这个值是未使用的。然后,我承诺,深入了解飞机的怀旧谷歌曲。

无论如何,回到手头的事情,如果有人知道什么堆血液_bitmap_planes意味着,请告诉我,我很奇怪地学习!我有一个亨希,它是来自旧ruby版本的残余物。

最后,我们本身的大小。 16384字节意味着每个页面都超过16kb。这些页面具有带有一些信息的标题,然后是他们的所有rvalues。存储rvalues的空间称为插槽。如此,当我们说堆_page_object_limit是409时,另一个框架的方法是每个页面的最多409个插槽。

再次,我们可以在这里检查数学。每个页面都有足够的空间,适用于所有rvalues,以及标题信息的额外额外的空间。我们知道每个页面最多有409个rvalues,每个rvalue都是40个字节。所以409 * 40 == 16,306< 16384。

堆(变量大小):Ruby的对象空间或内存。 Ruby存储所有页面。

页面(〜16 kB):Ruby Seagents如何堆。堆积包含页面。页面包含至多409个插槽。

rvalue(40字节):Ruby的对象的C表示。 有时包含对象的值,有时包含一个指针到对象在OS堆中生存的指针 这一切都是为了这篇文章! 正如我之前引用的那样,我将写一些关于垃圾收集的更多信息(博客帖子和一本书!!)。 如果您对以下帖子的跟随和听证有兴趣,请在下面留下您的电子邮件地址。