如何在 Rebol 3 中解释 stats/show
How to interpret stats/show in Rebol 3
想对 R3 脚本进行一些分析,并正在使用 stats 命令进行检查。
但是这些信息是什么意思呢?
如何使用它来监控内存使用情况?
>> stats/show
Series Memory Info:
node size = 16
series size = 20
5 segs = 409640 bytes - headers
4888 blks = 812448 bytes - blocks
1511 strs = 86096 bytes - byte strings
2 unis = 86016 bytes - unicode strings
4 odds = 39216 bytes - odd series
6405 used = 1023776 bytes - total used
0 free / 14075 bytes - free headers / node-space
Pool[ 0] 8B 202/ 3328: 256 ( 6%) 13 segs, 26728 total
Pool[ 1] 16B 178/ 512: 256 (34%) 2 segs, 8208 total
Pool[ 2] 32B 954/ 2560: 512 (37%) 5 segs, 81960 total
...
Pool[26] 64B 0/ 0: 128 ( 0%) 0 segs, 0 total
Pools used 654212 of 1906200 (34%)
System pool used 497664
== 1023776
它显示了内部内存管理信息,不确定它对脚本有多大用处。
无论如何,这里有一些关于内存池的解释。
大多数池都用于系列(有一个专用池用于 GOB!s,如果您正在查看 Atronix 源代码,还有一些其他池),为简单起见,我将在这里重点介绍系列池。
在内部,一个系列有一个 header 及其数据,它是一块连续的内存。 header 包含有关该系列的宽度和长度信息。数据保存系列的实际内容。在R3中大量使用Series来实现block!、port!、string!、object!等,所以在R3中管理内存几乎就是在管理(分配和销毁)series。由于series的长宽不同,引入pools来减少分片。
当需要一个新的系列时,header被分配到一个特殊的池中,并为它的数据选择另一个池。选择宽度接近系列大小的池。例如。一个包含 3 个元素的块可能会分配到一个宽度为 128 字节的池中(在 32 位系统上,一个块是一个包含 4(3 + 1 个终止符)元素的系列)。由于池可能会随着程序的运行而增加,因此它被实现为一个段列表。新段将根据需要分配并附加到列表中(但它永远不会释放回系统)。
另一个特殊的池是系统池,当需要的内存很大时选择。除了收集一些统计数据外,R3 实际上并不管理这个池。
当它试图收集垃圾时,它会清扫根上下文,并标记所有可以到达的东西,然后它会遍历系列header池,找出所有不需要的系列并销毁它们.
如果你使用stats没有细化,你可以看到实际的内存使用情况。因此,比较实施前后的内存使用情况,您可以看到哪个使用的内存更少。
>> stats
== 1129824
>> s: make string! 1024
== ""
>> stats
== 1132064
想对 R3 脚本进行一些分析,并正在使用 stats 命令进行检查。 但是这些信息是什么意思呢? 如何使用它来监控内存使用情况?
>> stats/show
Series Memory Info:
node size = 16
series size = 20
5 segs = 409640 bytes - headers
4888 blks = 812448 bytes - blocks
1511 strs = 86096 bytes - byte strings
2 unis = 86016 bytes - unicode strings
4 odds = 39216 bytes - odd series
6405 used = 1023776 bytes - total used
0 free / 14075 bytes - free headers / node-space
Pool[ 0] 8B 202/ 3328: 256 ( 6%) 13 segs, 26728 total
Pool[ 1] 16B 178/ 512: 256 (34%) 2 segs, 8208 total
Pool[ 2] 32B 954/ 2560: 512 (37%) 5 segs, 81960 total
...
Pool[26] 64B 0/ 0: 128 ( 0%) 0 segs, 0 total
Pools used 654212 of 1906200 (34%)
System pool used 497664
== 1023776
它显示了内部内存管理信息,不确定它对脚本有多大用处。
无论如何,这里有一些关于内存池的解释。
大多数池都用于系列(有一个专用池用于 GOB!s,如果您正在查看 Atronix 源代码,还有一些其他池),为简单起见,我将在这里重点介绍系列池。
在内部,一个系列有一个 header 及其数据,它是一块连续的内存。 header 包含有关该系列的宽度和长度信息。数据保存系列的实际内容。在R3中大量使用Series来实现block!、port!、string!、object!等,所以在R3中管理内存几乎就是在管理(分配和销毁)series。由于series的长宽不同,引入pools来减少分片。
当需要一个新的系列时,header被分配到一个特殊的池中,并为它的数据选择另一个池。选择宽度接近系列大小的池。例如。一个包含 3 个元素的块可能会分配到一个宽度为 128 字节的池中(在 32 位系统上,一个块是一个包含 4(3 + 1 个终止符)元素的系列)。由于池可能会随着程序的运行而增加,因此它被实现为一个段列表。新段将根据需要分配并附加到列表中(但它永远不会释放回系统)。
另一个特殊的池是系统池,当需要的内存很大时选择。除了收集一些统计数据外,R3 实际上并不管理这个池。
当它试图收集垃圾时,它会清扫根上下文,并标记所有可以到达的东西,然后它会遍历系列header池,找出所有不需要的系列并销毁它们.
如果你使用stats没有细化,你可以看到实际的内存使用情况。因此,比较实施前后的内存使用情况,您可以看到哪个使用的内存更少。
>> stats
== 1129824
>> s: make string! 1024
== ""
>> stats
== 1132064