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).count {|e| e == X } # => 2
X.object_id == "x".freeze.object_id # => true
N.times.collect {|e| "x".freeze.object_id }.uniq.count # => 1
RUBY_VERSION # => "2.2.2"