Частая сборка мусора может быть вызвана несколькими причинами. Например:
Возможно, ваше приложение создает слишком много временных объектов.
Утечки памяти, вызванные тем, что ваше приложение хранит ссылки на объекты, которые больше не нужны.
Куча может быть слишком маленькой.
Первые две проблемы будут обнаружены, если вы запустите профилировщик памяти в своем приложении, и решение, как правило, будет самоочевидным.
Третью проблему можно увидеть, изучив журналы GC, и заметив, что при каждом запуске GC удается только восстановить относительно небольшой объем памяти. В идеале вы хотите, чтобы сборщик мусора возвращал 50% или более кучи каждый раз при запуске. Исправление обычно заключается в увеличении максимального размера кучи с помощью параметра командной строки -Xmx
JVM.
Ускорим ли мы код с повторным использованием объекта?
Вообще говоря, нет. Переработка является болезненной, нет никаких гарантий, что она будет успешной. Например, вам будет трудно получить много классов в стандартной библиотеке Java и сторонних библиотеках для переработки внутренних структур данных.
Вы должны прибегать к явной переработке объектов только в том случае, если все другие попытки решить проблему не удаются. Самое простое решение часто состоит в том, чтобы просто дать приложению большую кучу.
РЕДАКТИРОВАТЬ
Один из способов уменьшить использование памяти для кода в редактируемом вопросе - изменить:
StringBuilder sb = new StringBuilder();
до
StringBuilder sb = new StringBuilder(s.length());
Это может также помочь в повторном использовании StringBuilder, но если этот код дает вам чрезмерную скорость GC, проблема, скорее всего, заключается в том, что есть утечка памяти (где-то еще в вашем приложении) или ваша куча слишком маленький. (Люди не понимают этого, но для каждой строки Java существуют значительные накладные расходы памяти ... что-то вроде 48 байтов, если моя арифметика верна).
РЕДАКТИРОВАТЬ 2
Журналы GC говорят, что вы восстанавливаете 50000Kb при каждом запуске GC, и они настоятельно рекомендуют, чтобы использование памяти не увеличивалось. (Последнее является хорошей новостью; в значительной степени это исключает утечку памяти.) Я думаю, вам нужно увеличить размер кучи, используя опции -Xmx
и -Xms
. Вы хотите использовать несколько мегабайт в каждом цикле GC, чтобы уменьшить средние издержки GC на возвращаемый байт.
Другая вещь, которая меня поразила, - это то, что, возможно, вы можете изменить свой метод removeAccents
, чтобы он создавал новую строку только в том случае, если строка результата будет отличаться от строки ввода. Другими словами, если нет акцентов, нужно просто вернуть входную строку.