You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何ObjectSpace.count_objects统计对象数无变化?new_object是否被立即回收?

Why does ObjectSpace.count_objects return 0 difference when assigning a string literal?

这事儿核心原因是Ruby的**字符串驻留(String Interning)**机制,咱们慢慢拆解:

1. 为什么两次计数差值都是0?

Ruby会自动对字符串字面量(就是你直接写在代码里的"tonytonyjan"这种固定字符串)做驻留处理:

  • 当你第一次执行new_object = "tonytonyjan"时,Ruby会检查内存中有没有已经存在的相同内容的字符串对象。如果没有,就创建一个并把它加入驻留缓存;如果有,直接复用这个对象的引用。
  • 你第二次再写new_object = "tonytonyjan"时,Ruby直接从驻留缓存里拿出了之前的那个字符串对象,完全没有创建新对象。
  • 不管是统计总对象数:TOTAL还是字符串对象数:T_STRING,因为全程没有新增对象,所以前后差值自然是0。

2. new_object有没有被立即销毁?

完全没有!
你赋值后new_object变量一直持有这个字符串对象的引用,Ruby的垃圾回收机制不会回收还有活跃引用的对象。之所以计数没变化,是从一开始就没生成新对象,根本不存在“创建后立即销毁”的情况。

验证小技巧

如果想看到计数变化,你可以试试创建动态生成的字符串(非固定字面量),比如:

total = ObjectSpace.count_objects[:T_STRING]
new_object = "tonytonyjan" + rand(100).to_s # 动态拼接的字符串不会被驻留
ObjectSpace.count_objects[:T_STRING] - total # 这时候结果就会是1啦

内容的提问来源于stack exchange,提问作者Weihang Jian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:51:47