У нас есть java/jruby webapp под управлением tomcat, и я анализировал количество объектов и использование памяти в приложении во время выполнения. Я заметил, что после запуска класс «org.jruby.RubyString» имел 1,118,000 экземпляров строки «», общее количество памяти кучи, используемое только пустыми строками, составляет 65 МБ, это для меня нелепо, потому что это 15% памяти используемый webapp. Пустая строка - это всего лишь один пример многих строковых значений с этой проблемой, если я могу ставить все строки jruby, которые я разработал, я мог бы сэкономить около 130 мб.Есть ли способ заставить Jruby работать во всех строках?
Я знаю на Java, каждый раз, когда создается строковое значение, он проверяет, существует ли значение в пуле строк и повторно использует его, если это произойдет. Мне интересно, есть ли в 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
Если вы замените все строки символами, вы получите это поведение, но я не знаю, как это сделать, чтобы автоматизировать строки. –
Не идеальное решение, потому что многие из этих строк созданы из сторонних драгоценных камней и плагинов. –
Можете ли вы опубликовать один из фрагментов кода, который создает эти пустые строки? – peter