ruby 2.1 から文字列リテラルをfreezeすると、一つの定数としてオブジェクトが共有されてオブジェクトが無駄に増えないようになっているそうです。(Effective Ruby 参照) freezeよりも文字列の生成が先なのに、なぜ増えないのか不思議です。 共有されるのは「文字列のみ」のようです。Hashで試したら定数にはなりませんでした。 X = "x".freeze N = 100000 GC.enable GC.start GC.disable N.times { "x" } ObjectSpace.each_object(String).count {|e| e == X } # => 100002 GC.enable GC.start GC.disable N.times { "x".freeze } ObjectSpace.each_object(String).coun