Mortal and Immortal Symbols in Ruby
Symbols are one of the most powerful datatypes that Ruby has to offer. Compare
and lookup operations are faster when symbols are used rather than strings. You can check this post to know more about symbols and their performance when compared to strings.
One disadvantage of using symbols is that, they live in the program’s memory for the entire life cycle of it’s execution. This is one of the reasons for faster symbol lookups. This also was the reason for many denial of service vulnerabilites in Ruby, for example this one.
From Ruby 2.2, there is a new concept of Mortal and Immortal Symbols. Internally ruby has three types of symbols. Mortal dynamic symbols, which are symbols created dynamically by user, Immortal dynamic symbols are the mortal dynamic symbols that have been promoted to immortal dynamic symbols and then there are immortal static symbols, which are function names, class names etc. The GC only collects the
Mortal dynamic symbols. An example of such symbols are symbols created by