Обычная версия
Java форум JavaTalks
форум программистов

Поиск   Пользователи   Группы   Регистрация 
 Профиль   Личные сообщения 

 Вход 

застрявшие потоки в terminated state ?
Список форумов
 ->  Нити и процессы


На страницу 1, 2  След. 
Начать новую тему 
Предыдущая тема :: Следующая тема  
Автор Сообщение
alexey : 213
Новичок
Откуда: Спб

СообщениеАвг 17, 2011 15:26 
Ответить с цитатой
есть код, вида (условно)

Код:
class MyThreadRunner implements Runnable {
 private boolean stopped = ...;
  /** Socket to accept client connections. */
    private ServerSocket server_socket;
 ....
        public void run() {
            while (!stopped) {
                  Socket socket = server_socket.accept();
                  new MyThread(socket).start();
            }
        }

class MyThread extends Thread { //внутренний класс
// в конструкторе получили сокет
        public void run() {
             Object obj = new Object();
             socketReader.readFrom(socket);
        }

}

}


сокет может не при чем Smile


Так вот упало такое приложение по ООМ, я смотрю мемори дамп и вижу, что в дампе лежат 10к объектов MyThread в состоянии TERMINATED, т.е. отработанных! соответственно так же в памяти скопились объекты obj...

как могло произойти такое, что эти потоки застряли? почему их не собрал GC?
_________________
Wink
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
Evgin : 748
Постоянный посетитель
Откуда: (SPB)

СообщениеАвг 17, 2011 15:53 
Ответить с цитатой
посмотрите на объекты, которые на эти потоки ссылаются, возможно какая-нибудь коллекция
К началу Посмотреть профиль Отправить личное сообщение
alexey : 213
Новичок
Откуда: Спб

СообщениеАвг 17, 2011 16:03 
Ответить с цитатой
т.к. потоки создаются строчкой

Код:

new MyThread(socket).start();


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

да и профайлер бы подсказал такие ссылки.
_________________
Wink
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
Taky_ : 491
Бывалый

СообщениеАвг 17, 2011 16:04 
Ответить с цитатой
А не дорого ли столько потоков плодить? Может в сторону пула об этом подумать? Сложность кода, почти не изменится.
К началу Посмотреть профиль Отправить личное сообщение
alexey : 213
Новичок
Откуда: Спб

СообщениеАвг 17, 2011 16:20 
Ответить с цитатой
они и не должны плодиться в таких масштабах. Единовременное максимальное количество потоков - порядка сотни.
Но почему-то отработанные потоки не собираются коллектором
_________________
Wink
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
alexey : 213
Новичок
Откуда: Спб

СообщениеАвг 17, 2011 16:25 
Ответить с цитатой
перед OOM были множественные high GC (т.е. GC работал)
_________________
Wink
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
Dagdamor : 406
Бывалый

СообщениеАвг 17, 2011 16:57 
Ответить с цитатой
Возможно, внутри этох тредов создаются поля-объекты, которые сохраняются где-либо еще.
_________________
Java и трассировка лучей
К началу Посмотреть профиль Отправить личное сообщение
Taky_ : 491
Бывалый

СообщениеАвг 17, 2011 17:39 
Ответить с цитатой
alexey писал(а):
они и не должны плодиться в таких масштабах. Единовременное максимальное количество потоков - порядка сотни.
Но почему-то отработанные потоки не собираются коллектором


1. Ну утчечку памяти надо искать профайлером. Может где-то ссылка на тред и теряется... куда-то мы this передаем.
2. 10к объектов MyThread - это вы создали 10к тредов, для каждого вделялся стек и.т.д. Ресурсов много кушается. Создание треда - это вам не хухры мухры. Полноценный объект ядра, два на самом деле стека, и я многое не помню из нюансов.
Может GC просто не успевал все почистить? Как там проц себя ведет?
К началу Посмотреть профиль Отправить личное сообщение
Evgin : 748
Постоянный посетитель
Откуда: (SPB)

СообщениеАвг 18, 2011 13:25 
Ответить с цитатой
было бы неплохо, если б вы дампы показали
К началу Посмотреть профиль Отправить личное сообщение
alexey : 213
Новичок
Откуда: Спб

СообщениеАвг 18, 2011 14:05 
Ответить с цитатой
спасибо всем откликнувшимся!

на расшаривание дампов у меня к сожалению нет полномочий Sad
_________________
Wink
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
Taky_ : 491
Бывалый

СообщениеАвг 18, 2011 14:49 
Ответить с цитатой
Так что в итоге вышло? Что решили?
Интересно ведь. Думаю абстрактные технические вещи, никак не виляют на секьюрити.
К началу Посмотреть профиль Отправить личное сообщение
alexey : 213
Новичок
Откуда: Спб

СообщениеАвг 18, 2011 17:41 
Ответить с цитатой
не, шарить мемори дамп целого приложения - это все же несекьюрно.

т.к. я толком придумать ничего не смог за определенное мне время - передал задачу более опытному коллеге, по результатам отпишусь, если он чего-нибудь нароет.
_________________
Wink
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
Taky_ : 491
Бывалый

СообщениеАвг 18, 2011 18:03 
Ответить с цитатой
Цитата:
шарить мемори дамп целого приложения - это все же несекьюрно.
СогласенSmile
Ждем результатов)
К началу Посмотреть профиль Отправить личное сообщение
abch-98-ru : 38
Новичок

СообщениеАвг 30, 2011 14:54 
Ответить с цитатой
Taky_ писал(а):
alexey писал(а):

Но почему-то отработанные потоки не собираются коллектором


1. Ну утчечку памяти надо искать профайлером. Может где-то ссылка на тред и теряется... куда-то мы this передаем.


>class MyThread extends Thread { //внутренний класс
внутренний класс нестатичный => ссылка на MyThreadRunner там есть.
К началу Посмотреть профиль Отправить личное сообщение
Jean : 1992
JavaTalks Team Member
Откуда: Санкт-Петербург

СообщениеОкт 04, 2011 3:15 
Ответить с цитатой
alexey писал(а):
перед OOM были множественные high GC (т.е. GC работал)

Full GC?
А про OOM, какое именно сообщение об ошибке выдала JVM? У нее есть и такое - не могу создать еще один поток. Связано с тем, что кончилась память в Stack space - области памяти JVM, из которой выделяется место под стек каждого Thread'а.
_________________
Всякое решение плодит новые проблемы
К началу Посмотреть профиль Отправить личное сообщение
 
Начать новую тему  Ответить на тему
Страница 1 из 2
На страницу 1, 2  След.
Список форумов
 -> Нити и процессы


 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Это сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

Хостинг от bizname.ru