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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Threads & lists, будте осторожнее! 
:(
    Опции темы
Sleepy_PIP
Дата 20.11.2004, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Программа построена так, что хранит активные тхреады в нескольких LinkedList.
При старте тхреада он заносится в несколько листов. При окончании run по finally тхред убирается из листа.
У меня получается так - активных тхреадов скажем ~20, - уничтоженных (закончивших свои run и выполнивших finally с уничтожением ссылки на класс из всех листов) еще ~30.
так в win32 по taskmanager вполне долгое время (2-5мин) существует ~50 тхреадов.
такие дела.



--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Domestic Cat
Дата 20.11.2004, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



А зачем так много тредов то?


--------------------

PM   Вверх
Sleepy_PIP
Дата 20.11.2004, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Domestic @ 20.11.2004, 22:02)
А зачем так много тредов то?

да я тут уже надоел навеное своей задачкой.
Задачка - сканить N сайтов M тхреадами по FTP. с записъю а БД.
посему надо много.
А если учесть что каждый FTP коннект - как имнимум 2 тхреада (не моих) + минимум 1 тхерад на коннект к БД ... да еще каждый тхреад имеет как минимум 1 контрольный (на каждый сайт - 1 контрольный, и M сканящих - как минимум) ... ну и листов - по контрольным, по общим, и в нутри каждого контрольного по сканащим ...
ну вообщем много получается.
За одно проверяю разные фиреволы. оказывается далеко не все способны держать по 20-50 коннектов наружу smile.



--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Domestic Cat
Дата 20.11.2004, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Поставь им всем маленький приоритет (1), мзохно просмотреть сколько все это памяти ест и сразу столько давать (-Хms, -Хmn). Но вообще-то если тред был запущен через start() и выполнил свой run(), он должен убираться коллектором, в данной ситуации почти сразу .


--------------------

PM   Вверх
Sleepy_PIP
Дата 20.11.2004, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Sleepy_PIP @ 20.11.2004, 22:10)
Цитата(Domestic @ 20.11.2004, 22:02)
А зачем так много тредов то?

да я тут уже надоел навеное своей задачкой.
Задачка - сканить N сайтов M тхреадами по FTP. с записъю а БД.
посему надо много.
А если учесть что каждый FTP коннект - как имнимум 2 тхреада (не моих) + минимум 1 тхерад на коннект к БД ... да еще каждый тхреад имеет как минимум 1 контрольный (на каждый сайт - 1 контрольный, и M сканящих - как минимум) ... ну и листов - по контрольным, по общим, и в нутри каждого контрольного по сканащим ...
ну вообщем много получается.
За одно проверяю разные фиреволы. оказывается далеко не все способны держать по 20-50 коннектов наружу smile.

но _моих_ тхреадов - не более 20 (5х4) - так они освобождаются нормально (по логам), тем не менее колл-во общих тхреадов далеко не следует за колл-вом моих тхреадов. задержка в 1-5 мин. не смотря на то что из всех листов все почищенно сразу. конечно все четко проверить и посчитать трудно. руководствуюсь тем, что утечки тхреадов нет, т.к. общее колл-во тхреадов таки возвращяется к некоей величине постоянно.
Добавлено @ 22:21
Цитата(Domestic @ 20.11.2004, 22:16)
Поставь им всем маленький приоритет (1), мзохно просмотреть сколько все это памяти ест и сразу столько давать (-Хms, -Хmn). Но вообще-то если тред был запущен через start() и выполнил свой run(), он должен убираться коллектором, в данной ситуации почти сразу .

у меня по эксплуатации складывается впечатление что если тхред в каком-то листе пофиксен - то пока из лита не уберешь - не освобождается. хотя run давно отработал.
И даже более - как тольбко тхред который объявлен как public class GetListThr extends Thread создается конструктором - он уже _есть_ не важно - run он или нет. собственно это соответствует книжкам.
Так вот - пока этот класс есть хоть в каком-то листе - он _будет_ и _будет_ занимать тхреад ... все под win32 конечно ...


--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Domestic Cat
Дата 20.11.2004, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



На самом деле даже если ты вообще о тредах не знаешь и пишешь 1 класс с 1 методом main, JVM пускает кучу своих тредов - диспетчер, коллектор и пр и пр.


--------------------

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


Опытный
**


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

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



Цитата(Sleepy_PIP @ 20.11.2004, 22:17)
Цитата(Sleepy_PIP @ 20.11.2004, 22:10)
Цитата(Domestic @ 20.11.2004, )
А зачем так много тредов то?

да я тут уже надоел навеное своей задачкой.
Задачка - сканить N сайтов M тхреадами по FTP. с записъю а БД.
посему надо много.
А если учесть что каждый FTP коннект - как имнимум 2 тхреада (не моих) + минимум 1 тхерад на коннект к БД ... да еще каждый тхреад имеет как минимум 1 контрольный (на каждый сайт - 1 контрольный, и M сканящих - как минимум) ... ну и листов - по контрольным, по общим, и в нутри каждого контрольного по сканащим ...
ну вообщем много получается.
За одно проверяю разные фиреволы. оказывается далеко не все способны держать по 20-50 коннектов наружу smile.

но _моих_ тхреадов - не более 20 (5х4) - так они освобождаются нормально (по логам), тем не менее колл-во общих тхреадов далеко не следует за колл-вом моих тхреадов. задержка в 1-5 мин. не смотря на то что из всех листов все почищенно сразу. конечно все четко проверить и посчитать трудно. руководствуюсь тем, что утечки тхреадов нет, т.к. общее колл-во тхреадов таки возвращяется к некоей величине постоянно.
Добавлено @ 22:21
Цитата(Domestic @ 20.11.2004, 22:16)
Поставь им всем маленький приоритет (1), мзохно просмотреть сколько все это памяти ест и сразу столько давать (-Хms, -Хmn). Но вообще-то если тред был запущен через start() и выполнил свой run(), он должен убираться коллектором, в данной ситуации почти сразу .

у меня по эксплуатации складывается впечатление что если тхред в каком-то листе пофиксен - то пока из лита не уберешь - не освобождается. хотя run давно отработал.
И даже более - как тольбко тхред который объявлен как public class GetListThr extends Thread создается конструктором - он уже _есть_ не важно - run он или нет. собственно это соответствует книжкам.
Так вот - пока этот класс есть хоть в каком-то листе - он _будет_ и _будет_ занимать тхреад ... все под win32 конечно ...

Еще далее - если класс тхреада есть в листе - он еще долго существует. Я подозреваю что листы чистятся довольно долго в отл. от обычных переменных по gc .... имхо - только подозрения.


--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Domestic Cat
Дата 20.11.2004, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Цитата(Sleepy_PIP @ 20.11.2004, 13:17)
у меня по эксплуатации складывается впечатление что если тхред в каком-то листе пофиксен - то пока из лита не уберешь - не освобождается. хотя run давно отработал.

само собой, ссылок на него не должно быть


--------------------

PM   Вверх
Sleepy_PIP
Дата 20.11.2004, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Domestic @ 20.11.2004, 22:22)
На самом деле даже если ты вообще о тредах не знаешь и пишешь 1 класс с 1 методом main, JVM пускает кучу своих тредов - диспетчер, коллектор и пр и пр.

их колл-во по сравнению с моими довольно мало. я заранее заню сколько даже побочных тхреадов на 1 мой скан. посему и вопию, что далеко не все сразу освобождается, что в листах. Кстати - без листов - все мгновенно (я не успеваю отследить).
Добавлено @ 22:28
Цитата(Domestic @ 20.11.2004, 22:24)
Цитата(Sleepy_PIP @ 20.11.2004, 13:17)
у меня по эксплуатации складывается впечатление что если тхред в каком-то листе пофиксен - то пока из лита не уберешь - не освобождается. хотя run давно отработал.

само собой, ссылок на него не должно быть

так дело то в том, что освобождаю я листы (в смысле удаляю ссылки на классы тхреадов из них) - но реакция следует через 1-5 мин. вот я об чем! и gc явный не помогает!


--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Domestic Cat
Дата 20.11.2004, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Цитата(Sleepy_PIP @ 20.11.2004, 13:23)
Еще далее - если класс тхреада есть в листе - он еще долго существует

не класс, а ссылка на объект


Цитата(Sleepy_PIP @ 20.11.2004, 13:23)
Я подозреваю что листы чистятся довольно долго в отл. от обычных переменных по gc .... имхо - только подозрения.

чистка листа - относительно долгая процедура по сравнению с массивом, но не настолько же. Кстати, гц листы вообще не чистит, он убирает объекты на которые нет ссылок.
Добавлено @ 22:29
Цитата(Sleepy_PIP @ 20.11.2004, 13:26)
Кстати - без листов - все мгновенно (я не успеваю отследить).


а можно тут поподробнее?


--------------------

PM   Вверх
Sleepy_PIP
Дата 20.11.2004, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Domestic @ 20.11.2004, 22:28)
Цитата(Sleepy_PIP @ 20.11.2004, 13:23)
Еще далее - если класс тхреада есть в листе - он еще долго существует

не класс, а ссылка на объект


Цитата(Sleepy_PIP @ 20.11.2004, 13:23)
Я подозреваю что листы чистятся довольно долго в отл. от обычных переменных по gc .... имхо - только подозрения.

чистка листа - относительно долгая процедура по сравнению с массивом, но не настолько же. Кстати, гц листы вообще не чистит, он убирает объекты на которые нет ссылок.
Добавлено @ 22:29
Цитата(Sleepy_PIP @ 20.11.2004, 13:26)
Кстати - без листов - все мгновенно (я не успеваю отследить).


а можно тут поподробнее?

ага. а если в листе есть ссылка на класс тхреада? тогда как? - лист .clear не выполнял. только .remove класса тхреада.
Однкао тхреад остался. на некоторое время. Вот что у меня получается.
Добавлено @ 22:33
Цитата(Sleepy_PIP @ 20.11.2004, 22:32)
Цитата(Domestic @ 20.11.2004, 22:28)
Цитата(Sleepy_PIP @ 20.11.2004, )
Еще далее - если класс тхреада есть в листе - он еще долго существует

не класс, а ссылка на объект


Цитата(Sleepy_PIP @ 20.11.2004, 13:23)
Я подозреваю что листы чистятся довольно долго в отл. от обычных переменных по gc .... имхо - только подозрения.

чистка листа - относительно долгая процедура по сравнению с массивом, но не настолько же. Кстати, гц листы вообще не чистит, он убирает объекты на которые нет ссылок.
Добавлено @ 22:29
Цитата(Sleepy_PIP @ 20.11.2004, 13:26)
Кстати - без листов - все мгновенно (я не успеваю отследить).


а можно тут поподробнее?

ага. а если в листе есть ссылка на класс тхреада? тогда как? - лист .clear не выполнял. только .remove класса тхреада.
Однкао тхреад остался. на некоторое время. Вот что у меня получается.

ну нет, конечно - на экземпляр класса, т.е. на переменную типа класса тхреада ... т.е. ссылка.
Добавлено @ 22:37
Цитата(Domestic @ 20.11.2004, 22:28)
Цитата(Sleepy_PIP @ 20.11.2004, 13:23)
Еще далее - если класс тхреада есть в листе - он еще долго существует

не класс, а ссылка на объект


Цитата(Sleepy_PIP @ 20.11.2004, 13:23)
Я подозреваю что листы чистятся довольно долго в отл. от обычных переменных по gc .... имхо - только подозрения.

чистка листа - относительно долгая процедура по сравнению с массивом, но не настолько же. Кстати, гц листы вообще не чистит, он убирает объекты на которые нет ссылок.
Добавлено @ 22:29
Цитата(Sleepy_PIP @ 20.11.2004, 13:26)
Кстати - без листов - все мгновенно (я не успеваю отследить).


а можно тут поподробнее?

из main делаю цикл по созданию тхреада (экземпляра типа класса тхреада), жду когда он закончится (пишу его в лок. переменную и анализирую isAlive), после цикла - тхреадов - 0. моих smile


--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Domestic Cat
Дата 20.11.2004, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Самое оптимальное решение для подобных задач - создать пул (pool) тредов, то есть к-л коллекшн с заранее запущенными 30-40 тредами. Треды эти спят все время, пока ты их не "будишь" для выпонения определенной задачи, поскле этого они возвращаются в пул. это будет намного эффективнее, т.к. не нужно будет непрерывно создавать/уничтожать их. Прочитать можно тут:

http://www-106.ibm.com/developerworks/java.../j-jtp0730.html
http://www.informit.com/articles/article.asp?p=30483&redir=1
http://www.javaworld.com/javaworld/jw-05-1...05-toolbox.html
http://www.samspublishing.com/articles/art...=30483&seqNum=3


--------------------

PM   Вверх
Sleepy_PIP
Дата 20.11.2004, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Domestic @ 20.11.2004, 22:39)
Самое оптимальное решение для подобных задач - создать пул (pool) тредов, то есть к-л коллекшн с заранее запущенными 30-40 тредами. Треды эти спят все время, пока ты их не "будишь" для выпонения определенной задачи, поскле этого они возвращаются в пул. это будет намного эффективнее, т.к. не нужно будет непрерывно создавать/уничтожать их. Прочитать можно тут:

http://www-106.ibm.com/developerworks/java.../j-jtp0730.html
http://www.informit.com/articles/article.asp?p=30483&redir=1
http://www.javaworld.com/javaworld/jw-05-1...05-toolbox.html
http://www.samspublishing.com/articles/art...=30483&seqNum=3

эт' я понимаюsmile ... тоолько пока не реализовал ... не той сложности задачка что-б это реализовывать (хотя и просто делается) ... вопрос как раз был в соотношении объектов типа thread и list'ов ... выяснилась (пока предварительно конечно), что удаление из list'ов GC производит оченно не регулярно ,, вот и вся комедия. не так?
Если не так - прошу научить как сделать быстрее, при учете что в личтах - тхреады.



--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Domestic Cat
Дата 21.11.2004, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Цитата(Sleepy_PIP @ 20.11.2004, 13:46)
не той сложности задачка что-б это реализовывать


Как раз той, тредов то много.


Цитата(Sleepy_PIP @ 20.11.2004, 13:46)
что удаление из list'ов GC производит оченно не регулярно


ГЦ из листов ничего удалять не может. Удаляешь ты (через ремув). А можно код где удаление треда из листа проишодит, посмотерть?


--------------------

PM   Вверх
Sleepy_PIP
Дата 21.11.2004, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Domestic @ 21.11.2004, 01:52)
Цитата(Sleepy_PIP @ 20.11.2004, 13:46)
не той сложности задачка что-б это реализовывать


Как раз той, тредов то много.


Цитата(Sleepy_PIP @ 20.11.2004, 13:46)
что удаление из list'ов GC производит оченно не регулярно


ГЦ из листов ничего удалять не может. Удаляешь ты (через ремув). А можно код где удаление треда из листа проишодит, посмотерть?

только прошу ногами не бить - я только учусь.
Вот один из классов тхреадов (у меня их несколько под разные нужды). точнее его метод run
//=============================================================================
public void run()
{
try
{
llog.LogLogThr(getName(),"Site:"+ftps.URL+" "+"================================ Start scan list thread for site:"+ftps.URL, 4);
// do scan site and write in DB

dbc = dbw.ConnectDB();
if(dbc==null)
{
llog.LogLogThr(getName(),"Site:"+ftps.URL+" "+"Dont possible get DBConnection. Thread stop",0);
return;
}
DoListFilesDB(lftp);
return;
}catch(Exception e)
{
llog.LogLogThrCallStack(getName(),"Site:"+ftps.URL+" "+"ERROR on scan dir, exception:"+e.toString(),0,e);
}
finally
{
try
{
if (dbc != null)
{
dbw.FreeConnection(dbc);
dbc=null;
}
}catch(Exception e)
{
llog.LogLogThrCallStack(getName(),"Site:"+ftps.URL+" "+"ERROR on free connection, exception:"+e.toString(),0,e);
dbc=null;
}
if(lftp!=null)
{
try
{
lftp.disconnect();
lftp=null;
}
catch(Exception e)
{
//!!!
}
lftp=null;
}

synchronized (PIPFTPSGetList.Gconf.GlobThreadList)
{
PIPFTPSGetList.Gconf.GlobThreadList.remove(this);
}
llog.LogLogThr(getName(),"Site:"+ftps.URL+" "+"================================ End scan list thread for site:" +ftps.URL, 4);
}
}


как видно - уделения их листа вроде-бы не избежать. синхронизация - такая во всеэ экземплярах тхреада. Однако! запись в логе я вижу, а общее колл-во тхреадов по тасклисту не уменьшается так-же быстро, как появляется запись в логе. Речь идет о десятках тхреадов, так что разница весьма заметна.
Прошу заметить заодно что в самом этом тхреаде используются как минимум еще создание 3-х тхреадов - 1 на коннкт к ДБ, и 2 под FTP - это уже не мои тхреады. - библиотечные.
Тем не менее общее колл-во тхреадов может значительно превышать расчетное. на 10-20 к примеру в пике.
не смотря на удаление и освобождение переменных ...




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

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

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


 




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


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

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