Tomcat の下で実行されている Java/jruby webapp があり、実行時にアプリが使用するオブジェクトとメモリの数を分析しています。起動後、クラス「org.jruby.RubyString」に文字列「」のインスタンスが 1,118,000 あることに気付きました。空の文字列だけで使用されるヒープ メモリの総量は 65 MB です。メモリの 15% であるため、これはばかげています。 webapp によって使用されます。空の文字列は、この問題を伴う多くの文字列値の 1 つの例にすぎません。解決したすべての jruby 文字列をインターンできれば、約 130 MB 節約できます。
文字列値が作成されるたびに、値が文字列プールに既に存在するかどうかを確認し、存在する場合は再利用します。Jruby に同じ最適化を持つオプションがあるかどうか疑問に思っていますか? もしそうなら、どうすれば有効にできますか?
Jruby での例:
v1 = "a"
v2 = "a"
puts v1.object_id # => 3352
puts v2.object_id # => 3354
Java での例:
String v1 = "a";
String v2 = "a";
System.out.println(v1.hashCode()); # => 97
System.out.println(v2.hashCode()); # => 97