проблемы управления памятью Java-потоков - PullRequest
1 голос
/ 06 декабря 2010

Сейчас я работаю над программой, которая, по сути, такова: есть 4 пути остановки с машинами, прибывающими на каждую дорогу в случайное время.Каждая дорога обслуживается FCFS, а перекресток проходит по круговой схеме, по 1 автомобильному переходу за раз.Каждый ожидающий автомобиль - это нить.Я получил синхронизацию потоков и алгоритм работает без проблем.Проблема, которую я не могу понять, заключается в том, как предотвратить ошибку: OutOfMemoryError: невозможно создать новый собственный поток.Я понимаю, что это происходит из-за того, что куча (стек? Я всегда их переключаю) переполняется.Я не могу найти способ гарантировать, что выполняемые потоки должным образом управляются сборщиком мусора и не задерживаются в памяти после выполнения.Я попытался настроить свои очереди (каждая «дорога» с автомобильными нитями) с мягкими ссылками и обнулил любые жесткие ссылки безрезультатно.Кто-нибудь здесь имеет опыт с этим !?СПАСИБО !!!

Ответы [ 3 ]

2 голосов
/ 06 декабря 2010

«OutOfMemoryError: невозможно создать новый собственный поток» не относится к памяти кучи.Это не поможет вам обнулить ссылки или использовать мягкие / слабые ссылки.Более того, увеличение размера кучи может только усугубить ситуацию.

Java использует собственную память для стеков потоков.Каждый раз, когда вы запускаете поток, новый стек выделяется вне кучи JVM.Стек не освобождается, пока поток не завершится.Рассмотрите возможность использования менее параллельных потоков (например, вы можете управлять числом, используя ThreadPoolExecutor), или, возможно, уменьшите размеры стека (используя -Xss {size} k)

См. Также этот пост ,который описывает много типов ошибок нехватки памяти.

0 голосов
/ 06 декабря 2010

Это произойдет, только если у вас слишком много запущенных потоков. (Не только ссылки на потоки) Как и @Markus, я бы посоветовал вам переключиться на ThreadPool, такой как ExecutionService, поскольку он будет управлять созданием потоков, и он работает.

Кстати: библиотека параллелизма восходит к 1998 году, но была включена только в Java 5.0 (2005), поэтому если вам нужна более старая версия, вы можете использовать либо бэкпорт, либо исходную библиотеку.

0 голосов
/ 06 декабря 2010

Вы пытались использовать ThreadPool ?

Вы можете создать ThreadPool начиная с Java 5, в котором вы решаете, сколько потоков Vm должен инициализировать для вашего алгоритма.Потоки создаются и используются повторно.

У меня была похожая проблема.Потоки GarbageCollector не удаляют и не удаляют потоки и продолжают жить вечно.

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