Утечки памяти с addShutDownHook - PullRequest
2 голосов
/ 17 июня 2011

В нашем веб-приложении мы используем Launcher для вызова некоторых функций командной строки (не моя идея) и видим результат.Это более или менее то, что мы делаем:

ClassWorld classWorld = new ClassWorld("plexus.core", Thread.currentThread().getContextClassLoader());
Launcher launch = new Launcher();
launch.setWorld(classWorld);
result = launch.mainWithExitCode(sArguments);

Ну, я недавно узнал, что, поскольку mainWithExitCode является статической функцией, она, вероятно, не выполняет то, что я думал, что сделал.Поэтому следующая версия, вероятно, будет просто:

Launcher launch = new Launcher();
result = launch.mainWithExitCode(sArguments);

Итак, мы тестировали наше приложение, и кажется, что оно течет из-за множества вещей, которые я не совсем понимаю.Итак, один старший из здесь (но не из нашего проекта) сказал нам, что это, вероятно, из-за CommandLineUtils, использующего addShoutDownHook, который «переносит» (что, вероятно, не самое подходящее слово) объект в java.lang.ApplicationShutdownHooks, и это нене уничтожать объект, пока сервер работает (в основном все время).Таким образом, каждая командная строка, которую выбрасывает наше веб-приложение, застревает в памяти на сервере, никогда не очищаясь.

Итак, мне сказали, что я должен найти свой процесс в waitFor и выйти из ShutdownHook.Видя мой код, кажется, наконец-то сложно это сделать, поскольку я не вызываю CommandLineUtils напрямую (полагаю, он вызывается внутри метода запуска).

Кто-нибудь знает, где яможете найти информацию для разработки этого?Я не прошу вас публиковать какой-то код, который решает проблему (хотя это было бы здорово), но чтобы указать мне на какую-то страницу или руководство, где я могу найти информацию, чтобы решить эту проблему.Время еще не является большой проблемой (у меня, вероятно, есть неделя или около того, чтобы выяснить и решить эту проблему), поэтому я могу потратить некоторое время на чтение руководств и тому подобного (и узнать, как это сделать в следующий раз).

Любая помощь будет оценена.Спасибо!

1 Ответ

2 голосов
/ 17 июня 2011

Да addShutdownHook течет сильно, очень сильно. Вы должны использовать removeShutdownHook, и даже в этом случае ThreadGroup может просочиться из-за ошибки.

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

Это означает, что у вас достаточно навыков для написания промежуточного программного обеспечения самостоятельно, и, скорее всего, вы развернете необходимый код Threading отдельно, как JMX или JCA.

Моя рекомендация: извлечь сервис из веб-приложения и действовать соответствующим образом. Написание промежуточного программного обеспечения без утечек требует немало навыков и терпения.

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