Wir haben eine java/jruby Webapp unter Tomcat laufen, und ich habe die Anzahl der Objekte und Speicherverbrauch von der App zur Laufzeit analysiert. Ich habe bemerkt, nach dem Start der Klasse "org.jruby.RubyString" hatte 1.118.000 Instanzen der Zeichenfolge "", die gesamte Menge an Heap-Speicher von leeren Strings allein verwendet wird 65mb, das ist mir lächerlich, weil es 15% des Speichers ist Wird von der Webanwendung verwendet. Die leere Zeichenfolge ist nur ein Beispiel für viele String-Werte mit diesem Problem, wenn ich alle jruby-Strings internieren kann, die ich ausgearbeitet habe, könnte ich etwa 130 MB sparen.Gibt es eine Möglichkeit, die JRuby-Laufzeit intern alle Zeichenfolgen intern zu machen?
Ich weiß in Java, jedes Mal, wenn ein String-Wert erstellt wird, wird es überprüfen, ob der Wert bereits im String-Pool vorhanden ist und es wiederverwenden, wenn es tut. Ich frage mich, ob es eine Option in Jruby gibt, die dieselbe Optimierung hat? Wenn ja, wie aktiviere ich es?
Beispiel in JRuby:
v1 = "a"
v2 = "a"
puts v1.object_id # => 3352
puts v2.object_id # => 3354
Beispiel in Java:
String v1 = "a";
String v2 = "a";
System.out.println(v1.hashCode()); # => 97
System.out.println(v2.hashCode()); # => 97
Wenn Sie alle Strings durch Symbole ersetzen, erhalten Sie dieses Verhalten, aber ich kenne keine Option, um es intern Strings automatisch zu machen. –
Keine ideale Lösung, da viele dieser Strings aus 3rd Party Gems und Plugins stammen. –
können Sie einen der Codeabschnitte veröffentlichen, der diese leeren Zeichenfolgen erzeugt? – peter