Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Tomcat: утечка памяти в Heap Space, как отловить гада? 
V
    Опции темы
Stampede
Дата 10.12.2008, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



Имеется такой неприятный глючок: вебсайт на Томкате периодически вычерпывает всю память, начинает выкидывать OutOfMemoryError, а потом и вовсе становится колом. Приходится перезапукскать.

Самое смешное, что когда я нагружаю вебсайт "нагрузчиком", он прекрасно справляется и держит нагрузку как стойкий оловянный солдатик. У меня даже JCrawler сломался на пятой тысяче запросов, а сайту хоть бы хны. Между тем в реале сайт зависает пару раз в день, причем от рестарта до зависания происходит всего лишь пара сотен обращений к серверу (к динамической его части, где генерится контент).

С учетом всего сказанного, у меня возникло предположение, что дело, скорее всего, в какой-то побочной функциональности: может, в статике, может, браузерный mp3-плейер не отпускает открытый файл, а может где-то треды бегают и держат свои ресурсы.

Вопрос: как вычислить виновника, учитывая, что дело происходит на уделенном сервере, доступ к которому только через терминал (SSH) и FTP.

ЗЫ. Профайлером на локальном компе смотрел, никакой утечки не обнаружил.


--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
necromancer
Дата 10.12.2008, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 317
Регистрация: 26.7.2006
Где: Москва

Репутация: 6
Всего: 7



Может много памяти кушают пользовательские сессии?
Ты когда нагружаешь нагрузкой пересоздаешь сессии или конектишься к одной и той же.


--------------------
С уважением, 
                 Виталий Смык
----------------------------------------------------------------------------------------------
SCJP, SCWCD, OCA
http://dev.maryno.net/video/
PM MAIL WWW ICQ Skype   Вверх
Maksym
Дата 10.12.2008, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 24
Всего: 62



Stampede
Можно сделать memory dump, забрать его и посмотреть HeapAnalizer'ом.

Добавлено через 40 секунд
правильное название HeapAnalyzer
PM MAIL   Вверх
Shurr
Дата 11.12.2008, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 24.10.2006

Репутация: 1
Всего: 7



Stampede
А в какой области памяти падает OutOfMemoryError? Полный стектрейс не покажешь?
PM MAIL   Вверх
Stampede
Дата 11.12.2008, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



necromancer, Maksym, Shurr - спасибо за участие. Борьба с мемори ликом продолжается. Возможно, есть некоторые подвижки, но полной уверенности пока нет.

Цитата(necromancer @  10.12.2008,  03:01 Найти цитируемый пост)
Может много памяти кушают пользовательские сессии?
Ты когда нагружаешь нагрузкой пересоздаешь сессии или конектишься к одной и той же.


Очень хороший вопрос. Но ответ гораздо проще: я вообще без надобности не создаю сессии. И лишь когда посетитель что-то постит, в этот момент сессия и создается. Так что на застревание данных в сессиях я не грешу.

Цитата(Maksym @  10.12.2008,  03:14 Найти цитируемый пост)
Можно сделать memory dump, забрать его и посмотреть HeapAnalyzer'ом.


Именно так и делаю. За прогу спасибо, не знал. Пока ничего вразумительного откопать не удалось. Но наметились кое-какие подозреваемые. Пытаюсь вырубать их одного за другим. По ходу открываю для себя интересные вещи (например, про commons-logging, который зашит в Томкате). Посмотрим, что получится.

Цитата(Shurr @  11.12.2008,  02:33 Найти цитируемый пост)
А в какой области памяти падает OutOfMemoryError? Полный стектрейс не покажешь? 


Да в общем практически всегда в одном и том же месте - на наиболее памятеемкой операции, формировании выходного текста путем слияния контекста с шаблоном. Но проблема не в самой этой операции, а в том, что какой-то гад к этому моменту заныкал себе большой кусок памяти и никак не хочет отдавать обратно.

В общем, продолжение следует.


--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
Shurr
Дата 11.12.2008, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 24.10.2006

Репутация: 1
Всего: 7



Stampede
Попробуй включить лог сборки мусора, возможно он поможет выявить утечку.
PM MAIL   Вверх
Maksym
Дата 11.12.2008, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 24
Всего: 62



Stampede
Цитата

Пока ничего вразумительного откопать не удалось. Но наметились кое-какие подозреваемые. 

Там должно быть довольно четко видно кто сколько схавал..
Цитата

Да в общем практически всегда в одном и том же месте - на наиболее памятеемкой операции, формировании выходного текста путем слияния контекста с шаблоном. Но проблема не в самой этой операции, а в том, что какой-то гад к этому моменту заныкал себе большой кусок памяти и никак не хочет отдавать обратно.

А Velocity нигде случайно не грешит такими вещами. 

Это сообщение отредактировал(а) Maksym - 11.12.2008, 14:08
PM MAIL   Вверх
Stampede
Дата 18.12.2008, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



Все, эпопея завершена. Глюк пофиксен. Подробности - здесь.

ЗЫ: Maksym получает плюса за подталкивание изучения вопроса в правильном направлении. necromancer - за привлечение внимания к интересному аспекту нагрузочного тестирования.

ЗЗЫ: Всем остальным - спасибо за внимание!



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
Kangaroo
Дата 18.12.2008, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 14
Всего: 104



Цитата

В свете вновь открывшегося знания пофиксить проблему заняло ровно одну строчку программы.

А можно посмотреть на эту выстраданную строчку? smile


--------------------
Lost....
PM MAIL MSN   Вверх
Asal
Дата 18.12.2008, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 26.12.2006
Где: Минск

Репутация: 4
Всего: 7



Цитата(Stampede @  18.12.2008,  11:06 Найти цитируемый пост)
Все, эпопея завершена

Поздравляю !  smile 

Вот только вопрос:
поделиться той строчкой кода, которая все решила, можешь ?
И где можно глянуть на Breeze, интересно стало smile


--------------------
PM MAIL ICQ   Вверх
Maksym
Дата 18.12.2008, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 24
Всего: 62



Stampede
Memory Analysis - вещь.
PM MAIL   Вверх
Asal
Дата 18.12.2008, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 26.12.2006
Где: Минск

Репутация: 4
Всего: 7



Цитата(Maksym @  18.12.2008,  15:23 Найти цитируемый пост)
Memory Analysis - вещь.

у меня эта вещь не запустилась, при 2 гигах оперативы, ругнулась: "Не могу выделить нужное количество памяти"


--------------------
PM MAIL ICQ   Вверх
COVD
Дата 18.12.2008, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 4
Всего: 43




Цитата

Глюк пофиксен. Подробности - здесь.
 

И чей же это "глюк". Неужели Томката?

Цитата

В две секунды стало ясно, что треды Томката не отпускают переменную типа ThreadLocal

PM MAIL   Вверх
Kangaroo
Дата 18.12.2008, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 14
Всего: 104



Цитата

Stampede (Online)

Есть надежда, что сейчас мы получим долгожданный ответ smile


--------------------
Lost....
PM MAIL MSN   Вверх
Stampede
Дата 19.12.2008, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



Цитата(Kangaroo @  18.12.2008,  14:55 Найти цитируемый пост)
Есть надежда, что сейчас мы получим долгожданный ответ smile 


Есть такая буква - получайте smile

Добавлено: куча подробностей, скриншоты, сниппеты, раздел "благодарности". Там же ответы на все вопросы, которые поднимались в обсуждении.

Цитата(Asal @  18.12.2008,  02:19 Найти цитируемый пост)
И где можно глянуть на Breeze, интересно стало smile 


Давай мыло, что-нибудь придумаем.

Цитата(COVD @  18.12.2008,  14:41 Найти цитируемый пост)
И чей же это "глюк". Неужели Томката?


Вполне мог быть и Томката. Такое в истории случалось не раз. И потом, я разве что-то говорил, что грешу именно на него? Упоминание Томката в заголовке имело целью всего лишь обозначить место действия. А если язвительное "чей же это "глюк"" - это все, что ты вынес из этой истории, то даже не знаю, что и сказать.

Всем остальным - еще раз спасибо за участие!


--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
COVD
Дата 19.12.2008, 06:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 4
Всего: 43



Цитата

А если язвительное...


 smile я неловко выразился. Уточнял, баг это или фича, что "треды ... не отпускают..". Но, наверное, диагноз не очевиден. 
PM MAIL   Вверх
Stampede
Дата 19.12.2008, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



Цитата(COVD @  18.12.2008,  21:46 Найти цитируемый пост)
Уточнял, баг это или фича, что "треды ... не отпускают.."


Ах, вот оно как оказывается smile

Знаешь, COVD, этот случай подтвердил мою давнишнюю теорию, что большинство конфликтов порождаются элементарным недопониманием, кто чего имел в виду. Ну хорошо, я рад, что все разрешилось без мордобития и эскалации напряженности. Каковой факт я отчасти ставлю в заслугу самому себе: много слов крутилось у меня на языке, но я выбрал самые нейтральные smile

Теперь по сути. Томкат в данном случае действительно ни при чем. Это чисто мой программистский недосмотр: необнуление переменной в момент, когда она перестает быть нужна. Но и большого криминала там с моей стороны тоже нет: поскольку ThreadLocal данного типа привязан к потоку под фиксированным именем, накопления связанной пямяти через этот механизм не происходит - при каждом новом запросе вместо старой инфы прописывается новая, а старая освобждается для сбора мусорщиком. Именно поэтому я не только не мог отловить это дело профайлером, но мне даже не удавалось завалить сервер нагрузчиком!

Резюмируя историю в целом: от ошибок не застрахован никто. Как известно, не ошибается тот, кто ничего не делает. Важно не бояться признаться в своих ошибках, быть готовым ликвидировать их последствия, и извлекать уроки на будущее. Я могу сказать, что я вышел из этой ситуации более сильным, чем когда в нее входил. Я получил навыки борьбы с ликами, пополнил свой арсенал полезными прогами, подчистил многие места в конфигах, обновил кучу библиотек. Если я в будущем снова столкнусь с проблемами утечки памяти, я буду готов к борьбе с ними гораздо лучше. Так что трепещите, мемори лики - я вас больше не боюсь!

Ну и надеюсь, мой опыт окажется в чем-то полезным и для вас. Не всем же учиться строго на собственных ошибках smile



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
ivg
Дата 19.12.2008, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 32
Всего: 81



Позволю себе сделать небольшое дополнение по теме. По моему скромному разумению лучше делать так:
Код

    public class BreezeController implements Controller {
        ...
        public void service(HttpServletRequest req, HttpServletResponse resp, ServletContext sctx) {
            ...
            ThreadContext tc = Application.getThreadContext();
            RequestContext oldContext = tc.get(RequestContext.DEFAULT_NAME);
            tc.put(RequestContext.DEFAULT_NAME, new RequestContext(sctx, req, resp));
            try {
                ...
            } finally {
                ...
                tc.put(RequestContext.DEFAULT_NAME, oldContext);
            }
        }
    }

Ну то есть идея понятна - не обнулять/удалять контекст из ThreadLocal, а возвращать старое значение перед возвратом управления контейнеру.
Это нужно во избежании потери нашего контекста, например при использовании RequestDispatcher.
PM MAIL   Вверх
Stampede
Дата 19.12.2008, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



Цитата(ivg @  19.12.2008,  02:11 Найти цитируемый пост)
Это нужно во избежании потери нашего контекста, например при использовании RequestDispatcher.


На первый взгляд выглядит разумно: действительно, ведь могут существовать компоненты, которые сидят выше в цепочке вызовов и при этом используют конструкции фреймворка - например, какие-нибудь фильтры. Однако если продолжать размышлять в этом направлении, то вместо того, чтобы сохранять потенциально возможный предыдущий контекст таким "стековым" способом, возможно, лучше было бы дать компонентам из разных слоев возможность обмениваться инфой друг с другом - например, через механизм вложенных контекстов или что-то типа того. В общем, надо подумать.

А вообще в архитектуре Бриза контроллер - это фактически точка входа во фреймворк (как он видится со стороны запроса), и RequestDispatcher отрабатывает уже внутри него, так что до сих пор проблем с потерей контекста не возникало.


--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
necromancer
Дата 19.12.2008, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 317
Регистрация: 26.7.2006
Где: Москва

Репутация: 6
Всего: 7



to Stampede: а вы не хотели бы выложить исходники велкикого и ужастного breeze?


--------------------
С уважением, 
                 Виталий Смык
----------------------------------------------------------------------------------------------
SCJP, SCWCD, OCA
http://dev.maryno.net/video/
PM MAIL WWW ICQ Skype   Вверх
ivg
Дата 19.12.2008, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 32
Всего: 81



Цитата(Stampede @  19.12.2008,  14:55 Найти цитируемый пост)
контроллер - это фактически точка входа во фреймворк (как он видится со стороны запроса), и RequestDispatcher отрабатывает уже внутри него

На всякий случай запощу пример потери контекста, о которой я говорил:
Код

package test;

import java.io.IOException;
import java.io.Writer;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet extends HttpServlet {

    private static final String REQUEST_DEEP_NAME = "REQUEST_DEEP";
    private static final ThreadLocal<String> CONTEXT = new ThreadLocal<String>();
    
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
        
        CONTEXT.set("Data");
        try {
            this.doService(req, resp);
        } finally {
            CONTEXT.remove();
        }
    }
    
    private void doService(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
        
        Integer deep = (Integer)req.getAttribute(REQUEST_DEEP_NAME);
        Writer w = resp.getWriter();
        if (deep == null) {
            req.setAttribute(REQUEST_DEEP_NAME, Integer.valueOf(1));
            resp.setContentType("text/plain");
            w.write("-- begin " + CONTEXT.get() + " --\n");
            req.getRequestDispatcher("/").include(req, resp);
            w.write("-- end " + CONTEXT.get() + " --\n");
        } else {
            w.write("< body >\n");
        }
    }
}


web.xml:
Код

<web-app ...>
    ...
    <servlet>
        <display-name>TestServlet</display-name>
        <servlet-name>TestServlet</servlet-name>
        <servlet-class>test.TestServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TestServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>


Это сообщение отредактировал(а) ivg - 19.12.2008, 21:15
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0676 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.