为何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
相关产品推荐
相关产品推荐

