2011-09-26 4 views
4

У меня проблема в моей кодовой базе, где мы неправильно закрываем дескрипторы файлов или, возможно, потоки. В конечном итоге мы получаем исключение TooManyOpenFiles при очень большой нагрузке. Основываясь на выводах lsof, мы уверены, что знаем, где происходит утечка (в нашей системе ведения журнала), но мой вопрос: как я могу написать единичный тест, который проверяет, когда он завершен, что ресурсы были закрыты должным образом? Есть ли способ запросить JRE, чтобы узнать, сколько файлов в настоящее время открыто? Могу ли я каким-то образом перехватить файловые операции, чтобы я мог их контролировать?Что такое хороший шаблон для теста модуляции Java, который гарантирует, что вы правильно закрываете файлы?

Я подозреваю, что мне понадобится инструмент для моего кода, чтобы управлять всеми файлами ввода/вывода, подсчитывать ссылки и следить за тем, чтобы они закрывались таким образом, но если кто-нибудь знает о нисходящем решении, идеи, о которых я упоминал выше, это будет огромной помощью!

+0

Я считаю, что Java делает все это в фоновом режиме, поэтому его следует позаботиться. Хм, может быть, я пропустил его, хотя – Coffee

+1

Java в конечном итоге собирает мусор и закрывает ваши открытые файлы, но если вы откроете и выбросите ресурсы очень быстро, он не сможет идти в ногу со временем. Закрытие ручек явно намного лучше. –

ответ

2

Поскольку вы говорите о тестах, PowerMock http://code.google.com/p/powermock/ может сделать трюк. Это позволяет издеваться над статическими методами и конструкторами, если я не ошибаюсь. Таким образом, вы могли бы издеваться над дизайнерами и методами закрытия или тем, что вам нужно для освобождения ресурсов.

Я стараюсь избегать этого в своих тестах, но в случае, который вы описываете, это может стоить хлопот.

+0

Я правильно отмечаю этот ответ, так как он ближе всего по духу к тому, что я искал, но в моем случае я решил не писать единичный тест в конце. Просто использовал lsof для проверки того, что файлы не закрывались перед моим патчем и закрывались после. –

3

Вы можете использовать инструмент аспектно-ориентированного программирования (AOP), например AspectJ, чтобы добавить код для подсчета открытых/закрытых файлов на FileInputStream и FileOutputStream. Это довольно легко сделать (детали зависят от инструмента, конечно) прочные и неинвазивные.

+0

Я думаю, что AspectJ является неинвазивным, когда вы рассматриваете возможность изменения своей цепочки сборки неинвазивным. –

+0

Это для тестового здания с AspectJ будет частью настройки тестов. –

+0

Да - это кажется больше, чем я хотел бы добавить к этому довольно низкоуровневому библиотечному коду. –

0

Похоже, вы можете смотреть это через JMX.

Кто отвечал код здесь: http://java-monitor.com/forum/showthread.php?t=130

Вы должны включить JMX в вашей виртуальной машины Java, если вы еще не сделали.

+1

Звучит как хороший операционный подход, но я не думаю, что он будет работать как единичный тест. –

 Смежные вопросы

  • Нет связанных вопросов^_^