Как я могу очистить все после кода? - PullRequest
1 голос
/ 09 сентября 2011

У меня есть программа, которая запускается внешним программным обеспечением.Первый запуск всегда успешен.Второй запуск приводит к зависанию моего программного обеспечения, потому что что-то осталось от предыдущего запуска (некоторые объекты, некоторые процессы).Я не могу найти то, что осталось.Мне кажется, что я чищу правильно, но, видимо, я ошибаюсь.

Есть ли эффективный способ остановить и почистить все?Я не могу использовать exit(0), поскольку это приведет к уничтожению внешнего программного обеспечения.

ДОБАВЛЕНО

Я использую интерфейс Java для связи между моим и внешним программным обеспечением.Примерно так:

mySoftware = new MySoftware(parameters);
my.Software.start();
my.Software.stop();

Ответы [ 4 ]

2 голосов
/ 09 сентября 2011

Общие подходы к поиску утечек:

  • Используйте профилировщик, например VisualVM, чтобы показать использование памяти вашей программой.
  • Остановите приложение с помощью Ctrl + Break и проверьте, чтопотоки работают и могут находиться в заблокированном состоянии.
  • Поместите операторы отладки в код, чтобы определить, где он висит.
  • Запустите его с помощью инструментов статического анализа кода, таких как FindBugs, которые могут определитьресурсы не освобождены правильно.

Поиск и устранение основной причины проблемы ИМХО всегда предпочтительнее, чем устранение симптомов.

0 голосов
/ 09 сентября 2011

Рекомендуется присваивать null объектам, которые вы создаете в конце кода. Он может быть помещен в блок finally, если есть какие-либо блоки try / catch. Это не приведет к немедленной очистке объектов из области памяти, но позволит сборщику мусора узнать, что эти объекты можно очистить.

Пример кода для вас.

try{
HSSFWorkbook workBook = new HSSFWorkbook();
HSSFSheet sheet1 = workBook.createSheet("Log_Report");
HashMap<Integer, HSSFRow> hashMapRow = new HashMap<Integer, HSSFRow>();
...
}
catch{}{
...
}
finally{
sheet1=null;
workBook=null;
hashMapRow=null;
}
0 голосов
/ 09 сентября 2011

Вы могли бы начать с запуска одноэлементного детектора Google для своего кода и проверки того, что ваш код очистки также заботится о единичных экземплярах.

В качестве продолжения вы могли бы взглянуть на рефакторинг тех одноэлементных экземпляров, которые на самом деле не должны быть одиночными, и заменить их кодом, используя вместо этого внедрение зависимостей (выделение объекта для использования и передача его через construstors используемых экземпляров) часто лучшее решение.)

0 голосов
/ 09 сентября 2011

Я бы посоветовал вам провести тестирование / отладку / (ресурсное) ведение журнала / профилирование памяти / статический анализ / подключаемый тип-проверяя , чтобы найти причину, а затем устранить ее.

Если вы выполняете тесты, а «что-то осталось» может быть файлом, то вы можете легко проверить это с помощью TempitFolder-правила junit , см. , например, это введение .

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