Есть ли исправление утечки памяти в jsp теге BodyContentImpl при использовании Tomcat?
Я прочитал некоторые отчеты об ошибках в Apache о неэффективности BodyContentImpl и о том, как он распределяет пространство cb. (private char[] cb;
) Если тег записывает 50 КБ HTML, размер буфера будет увеличиваться с 512 байт до 50 КБ, каждый раз, когда требуется выделение, он создает новый символ [] и выполняет два System.arraycopy
звонки.
https://issues.apache.org/bugzilla/show_bug.cgi?id=43925
В этих отчетах об ошибках говорится, что ошибка была перемещена в очередь для Tomcat 7, но в примечаниях к выпуску я пока ничего не вижу. Кто-нибудь смог обойти эту проблему, используя Tomcat за это время?
Я прочитал о LIMIT_BUFFER=true. Они говорят, что при установке этого флага наблюдается снижение производительности. Код освободит текущий sb и перераспределит новый обратно в 512 байт.
public void clear() throws IOException {
467 if (writer != null) {
468 throw new IOException();
469 } else {
470 nextChar = 0;
471 if (LIMIT_BUFFER && (cb.length > Constants.DEFAULT_TAG_BUFFER_SIZE)) {
472 bufferSize = Constants.DEFAULT_TAG_BUFFER_SIZE;
473 cb = new char[bufferSize];
474 }
475 }
476 }
Если этот код вызывается несколько раз в одном и том же запросе, это может вынудить вас начать сначала с небольшого буфера и в конечном итоге создать больше cb для сбора мусора.
В отчете об ошибках есть предложенные изменения, но мне интересно, если кто-нибудь реализовал что-то, чтобы исправить эту проблему, чтобы он не генерировал так много потраченных строк и выполнял так много System.arraycopy
звонки. Спасибо!
1 ответ
Нет, по этому запросу улучшения больше не было.
Я бы пошел с LIMIT_BUFFER=true. Как и во всем, что, по вашему мнению, может иметь проблемы с производительностью, запустите ваше приложение через профилировщик, чтобы посмотреть, есть ли что-то, о чем можно беспокоиться. Есть много вариантов. Я использую YourKit, так как они дают бесплатные копии разработчикам с открытым исходным кодом.