| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
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);
}
}
} |
сокет может не при чем
Так вот упало такое приложение по ООМ, я смотрю мемори дамп и вижу, что в дампе лежат 10к объектов MyThread в состоянии TERMINATED, т.е. отработанных! соответственно так же в памяти скопились объекты obj...
как могло произойти такое, что эти потоки застряли? почему их не собрал GC? _________________
 |
|
|
|
 |
Evgin : 748 Постоянный посетитель Откуда: (SPB)
|
Авг 17, 2011 15:53 |
|
|
| посмотрите на объекты, которые на эти потоки ссылаются, возможно какая-нибудь коллекция |
|
|
|
 |
alexey : 213 Новичок Откуда: Спб
|
Авг 17, 2011 16:03 |
|
|
т.к. потоки создаются строчкой
| Код: |
new MyThread(socket).start();
|
т.е. просто объект создается без ссылки на него, это гарантирует то, что на эти объекты никто больше не ссылается.
да и профайлер бы подсказал такие ссылки. _________________
 |
|
|
|
 |
Taky_ : 491 Бывалый
|
Авг 17, 2011 16:04 |
|
|
| А не дорого ли столько потоков плодить? Может в сторону пула об этом подумать? Сложность кода, почти не изменится. |
|
|
|
 |
alexey : 213 Новичок Откуда: Спб
|
Авг 17, 2011 16:20 |
|
|
они и не должны плодиться в таких масштабах. Единовременное максимальное количество потоков - порядка сотни.
Но почему-то отработанные потоки не собираются коллектором _________________
 |
|
|
|
 |
alexey : 213 Новичок Откуда: Спб
|
Авг 17, 2011 16:25 |
|
|
перед OOM были множественные high GC (т.е. GC работал) _________________
 |
|
|
|
 |
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 |
|
|
спасибо всем откликнувшимся!
на расшаривание дампов у меня к сожалению нет полномочий  _________________
 |
|
|
|
 |
Taky_ : 491 Бывалый
|
Авг 18, 2011 14:49 |
|
|
Так что в итоге вышло? Что решили?
Интересно ведь. Думаю абстрактные технические вещи, никак не виляют на секьюрити. |
|
|
|
 |
alexey : 213 Новичок Откуда: Спб
|
Авг 18, 2011 17:41 |
|
|
не, шарить мемори дамп целого приложения - это все же несекьюрно.
т.к. я толком придумать ничего не смог за определенное мне время - передал задачу более опытному коллеге, по результатам отпишусь, если он чего-нибудь нароет. _________________
 |
|
|
|
 |
Taky_ : 491 Бывалый
|
Авг 18, 2011 18:03 |
|
|
| Цитата: |
| шарить мемори дамп целого приложения - это все же несекьюрно. |
Согласен
Ждем результатов) |
|
|
|
 |
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'а. _________________ Всякое решение плодит новые проблемы |
|
|
|
 |
|
|