Я немного начинаю, когда речь заходит о приложениях JAVA, но участвовала в разработке довольно сложного приложения JAVA (8), которое требует многопоточности. У меня и у другого разработчика все время возникала проблема, из-за которой приложение некоторое время не работает.JAVA Многопоточность, утечка памяти, сборщик мусора
Сначала мы предоставили приложение 64 ГБ памяти, но через несколько часов у него закончилась память, сбой и перезагрузка. Только продолжать делать это снова и снова. Контекст; Приложение принимает сообщения из системы обмена сообщениями (ActiveMQ), а из метаданных сообщения необходимо создать файл XML, вызвав различные источники данных для значений. Там может быть буквально миллионы сообщений, которые необходимо обработать, поэтому мы разработали многопоточную систему, каждый поток связан с сообщением - и дал приложение 40 потоков.
Однако, поскольку он продолжает принимать сообщения, общее потребление памяти увеличивается со временем. Я чувствую, что сборщик мусора не используется нами правильно?
Так что в данный момент у нас есть одна родительская нить:
(new Thread(new ReportMessageConsumer(config, ""))).start();
Тогда в ReportMessageConsumer мы имеем X число установки нитей, так что это будет в нашей текущей установке 40. Так что все это под одной группой. Как только XML был построен и потоки сделаны с тем, как мы эффективно убиваем поток и принудительно собираем сборщик мусора, чтобы освободить эту память, чтобы мы могли затем создать новый чистый поток, чтобы получить другое сообщение?
Поток умирает вскоре после того, как его 'Run() метод' либо возвращает или вызывает исключение. Если ваш код не содержал ссылки на объект «Thread» (и ваш пример явно не сохраняет его), тогда объект «Thread» и все объекты, на которые ссылается стека потока, должны немедленно стать elgible, чтобы быть исправленными ГК. –
Не используйте потоки напрямую, если вы хотите их убить, а другой - для обработки «другого сообщения»: используйте исполнителей. –
Какое точное OutOfMemoryError вы видите? Это куча, стек, gc накладные расходы, неспособность создавать собственные потоки? –