Утечка памяти в приложении Tomcat 6.0 - PullRequest
0 голосов
/ 17 марта 2012

Я работаю с приложением сокета.У меня есть JAVA TCP слушатель как часть веб-приложения.Я определил мой прослушиватель TCP как прослушиватель контекста сервлета в файле web.xml, поэтому, как только я запускаю свой tomcat, мой прослушиватель TCP становится активным и ожидает поступления входящего запроса от устройства GPS.

После запуска моего tomcat6.0Слушатель TCP может прочитать все входящие запросы, но через 5 минут я получаю сообщение об ошибке: «Похоже, веб-приложение запустило именованный поток, но не смогло его остановить. Это, скорее всего, приведет к утечке памяти.".

Пожалуйста, помогите мне, как решить эту проблему.Поскольку я создаю одновременно много потоков для обработки входящего запроса, так как у нас есть устройство 10K GPS, которое связывается с моим слушателем TCP.У нас есть бизнес-причина для создания единого потока для одного устройства и обработки входящего запроса.

Пожалуйста, помогите мне выяснить актуальную проблему.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 18 марта 2012
The web application appears to have started a thread named but has failed to stop it.

Пожалуйста, помогите мне, как решить эту проблему.

Ну, может остановить эту тему? Похоже, ваше сообщение об ошибке является неполным, обычно оно имеет имя потока (или, может быть, ваши темы имеют пустое ("") имя?

Эта ошибка в Tomcat не является критической, но вы должны выяснить, почему она появляется, взглянуть на: Может ли это привести к утечке памяти в Tomcat? и особенно на Tomcat 6 записи журнала утечек памяти для целевых потоков.

Чтобы остановить поток, проверьте: Как остановить поток, который работает вечно без использования .

0 голосов
/ 18 марта 2012

Я предполагаю, что вы проверили настройки JVM, с которыми вы запускаете Tomcat. Возможно, у вас слишком мало памяти.

Я бы порекомендовал вам загрузить Visual VM 1.3.3, установить все плагины, запустить приложение Tomcat и подключить Visual VM к JVM. Он покажет вам, что происходит в памяти, процессоре, созданных объектах, потоках и т. Д.

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

У нас есть бизнес-причина для создания единого потока для одного устройства. и обработать входящий запрос.

Возможно, у вас есть деловая причина, но ваши технические причины могут быть неверными. Каждый входящий HTTP-запрос имеет один поток. Разве это не то, что вы хотите? Когда GPS отправляет запрос, у вас есть одна нить для его обработки, верно? Почему вы должны создавать много потоков с каждым запросом? Что эти темы делают?

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

Я не знаю, потрудились ли вы написать свой собственный сервер, но я бы порекомендовал вам изучить Netty. Это полностью Java-сервер, основанный на неблокирующем вводе-выводе и предназначенный для обработки большого трафика. Они знают, как обращаться с потоками. Может быть, вы можете просто использовать его и добавить к нему свою логику обработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...