![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Ares4322 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 339 Регистрация: 25.9.2007 Где: Россия, Москва Репутация: 2 Всего: 3 |
Доброго времени суток!
Есть проект на Java. Он крутится он Tomcat 7. Приложение состоит из толстого javascript клиента, который периодически опрашивает сервлет. В init() сервлета получается БД-соединение из пула сервера. В destroy() это соединение закрывается. Проблема в том, что при запуске сервера с приложением память, которую он занимает, равна примерно 100 Мб. Через несколько дней она увеличивается до 600 Мб. И при этом если подсоединится к серверу и запросить данные, то при первом запросе он сильно тормозит, а потом отвечает пошустрее. Количество пользователей, постоянно висящих на сервере, обычно не превышает 10. Я подозреваю, что не освобождается память, выделенная приложению, или (что мало вероятно) течет память в самом сервере. Подскажите, что это может быть и какими инструментами можно воспользоваться, чтобы определить источник проблемы? |
|||
|
||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 28 Всего: 159 |
любой профайлер в помощь, начать можно с visualvm - он с состав jdk входит.
|
|||
|
||||
| Ares4322 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 339 Регистрация: 25.9.2007 Где: Россия, Москва Репутация: 2 Всего: 3 |
А какая технология работы с профайлерами?
То есть какие параметры замерять, что с чем сравнивать, на что обращать внимание? Если можно, то скиньте какие-нибудь ссылки для ознакомления. |
|||
|
||||
| Samotnik |
|
|||
![]() Super star ! ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 7192 Регистрация: 4.11.2006 Где: Минск City Репутация: 5 Всего: 191 |
||||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 4 Всего: 43 |
Вы как-то сумбурно сформулировали. Может вы некорректно используете пул соединений? В сервлете в начале обработки запроса соединение берется из пула и после отправки ответа соединение возвращается в пул. Это сообщение отредактировал(а) COVD - 21.6.2011, 16:10 |
|||
|
||||
| Ares4322 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 339 Регистрация: 25.9.2007 Где: Россия, Москва Репутация: 2 Всего: 3 |
Нет. Я именно при инициализации сервлета получаю соединение и закрываю его только при уничтожении сервлета.
Зачем каждый раз открывать/закрывать соединение? Samotnik, спасибо за ссылку. Опытным путем и с помощью утилиты поиска утечек в томкате определил, что при редеплое приложения некоторые классы приложения не выгружаются. Тут, видимо, память и течет. А тормоза особо с этим не связаны. |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 4 Всего: 43 |
Но инстанс сервлета обычно один и он должен обслуживать запросы параллельно. Если же соединение с базой одно на инстанс, то наверное вы, используя синхронизацию, вынуждаете сервлет обслуживать запросы последовательно. Если бы вы брали соединения из пула и возвращали, то была бы параллельная обработка. |
|||
|
||||
| Ares4322 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 339 Регистрация: 25.9.2007 Где: Россия, Москва Репутация: 2 Всего: 3 |
А разве для каждой сессии не используется свой экземпляр сервлета в отдельном потоке?
|
|||
|
||||
| COVD |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 4 Всего: 43 |
Нет. По умолчанию - один экземпляр для всех потоков. Если же сервлет имплементирует interface SingleThreadModel, то контейнер, возможно, создаст пул экземпляров.
Но этот интерфейс давно уже deprecated и такой подход всеми признан не эффективным. Это сообщение отредактировал(а) COVD - 22.6.2011, 15:35 |
||||
|
|||||
| Skipy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 487 Регистрация: 24.8.2006 Где: Москва, Россия Репутация: 2 Всего: 16 |
Совершенно точно нет. Экземпляры сервлета создаются в том количестве, которое сочтет нужным контейнер. Но везде говорится, что сервлет дожен быть thread safe, т.е. один экземпляр может использоваться в разных потоках. |
|||
|
||||
| Ares4322 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 339 Регистрация: 25.9.2007 Где: Россия, Москва Репутация: 2 Всего: 3 |
Понятно, то есть нужно при каждом обращении к БД получать свое соединение с БД и после этого его закрывать.
А не подскажете инструмент, с помощью которого можно проще и быстрее писать код работы с БД. Но ORM мне не нужен. SpringJDBCtemplate, Apache JDBC util или еще что-то? |
|||
|
||||
| Farmazon |
|
|||
![]() Разработчик ![]() ![]() Профиль Группа: Участник Сообщений: 265 Регистрация: 7.7.2006 Репутация: 3 Всего: 5 |
myBatis?...
Это сообщение отредактировал(а) Farmazon - 24.6.2011, 18:46 -------------------- Таково моё общее мнение. |
|||
|
||||
| Ares4322 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 339 Регистрация: 25.9.2007 Где: Россия, Москва Репутация: 2 Всего: 3 |
Farmazon, спасибо, посмотрю.
|
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |