Tenemos una aplicación web java/jruby ejecutándose bajo Tomcat, y he estado analizando la cantidad de objetos y el uso de memoria de la aplicación durante el tiempo de ejecución. He notado que después del inicio la clase "org.jruby.RubyString" tenía 1,118,000 instancias de la cadena "", la cantidad total de memoria de montón usada por cadenas vacías solo es de 65mb, esto para mí es ridículo porque es 15% de la memoria utilizado por la aplicación web. La cadena vacía es solo un ejemplo de muchos valores de cadena con este problema, si puedo internar todas las cadenas de jruby que resolví, podría ahorrar unos 130mb.¿Hay alguna manera de hacer que el tiempo de ejecución de Jruby sea interno en todas las cadenas?
Sé en Java, cada vez que se crea un valor de cadena, comprobará si el valor ya existe en el grupo de cadenas y lo reutilizará si lo hace. Me pregunto si hay una opción en Jruby que tenga la misma optimización. si es así, ¿cómo lo habilito?
Ejemplo de jruby:
v1 = "a"
v2 = "a"
puts v1.object_id # => 3352
puts v2.object_id # => 3354
Ejemplo en Java:
String v1 = "a";
String v2 = "a";
System.out.println(v1.hashCode()); # => 97
System.out.println(v2.hashCode()); # => 97
Si reemplazas todas las cadenas con símbolos, obtendrás ese comportamiento, pero no conozco ninguna opción para convertirlo en cadenas automáticas. –
No es una solución ideal porque muchas de estas cadenas se crean a partir de gemas y complementos de terceros. –
¿Puedes publicar una de las piezas de código que produce estas cadenas vacías? – peter