来自示例 ruby 代码,如下所示:
a = 0.0
a = nil
现在,我想知道当变量"a"的值为"0.0"和值为"nil"时占用了多少存储空间。谢谢。
我知道的最
接近现实的方法就是使用操作系统的内存报告。以下可能仅适用于 MRI。
▶ def report
▷ puts 'Memory ' + `ps ax -o pid,rss | grep -E "^[[:space:]]*#{$$}"`.
▷ strip.split.map(&:to_i)[1].to_s + 'KB'
▷ end
▶ report
#⇒ Memory 90276KB
▶ a = nil && report
#⇒ Memory 90712KB
▶ a = nil && report
#⇒ Memory 90712KB NB!!! NOT CHANGED!
▶ a = "a" && report
#⇒ Memory 90908KB
▶ a = "a" && report
#⇒ Memory 91096KB NB!!! CHANGED!!
▶ a = "a" && report
#⇒ Memory 91388KB NB!!! CHANGED!!
▶ ObjectSpace.garbage_collect && report
#⇒ Memory 91512KB NB!!! INCREASED!!!
也就是说,没有办法确定物体会占用多少空间。消耗的内存量将是以下各项的总和:
- 堆中分配的内存量
- 声明变量所需的
RValue
- Ruby 内部内存分配器,负责处理 Ruby 堆(以及它们操作的堆(
后者是不可预测的,无法根据数据大小进行预测/计算。当有足够数量的 Ruby 插槽时,短字符串可能需要零字节。
请注意,RValue
是在所谓的 Ruby Heap 中分配的,并且此内存永远不会返回到操作系统。从不意味着永远。