getMethod кеширует и вызывает утечку памяти - PullRequest
4 голосов
/ 22 июня 2011

Я использую автоматически сгенерированный класс Java для выполнения специального метода. Из-за этого я должен вызывать метод путем отражения.

Это выполнение запускается потоком Swing, поскольку метод (вызывается из «неизвестного» класса) обновляет элемент пользовательского интерфейса. Каждое выполнение нового потока ищет метод в классе, вызывая

Class {
...
public Method[] getMethods() throws SecurityException
...
}

Логика getMethods, кэширует элемент, но я не знаю почему. Профилировщик показывает мне, что объекты метода плавают в памяти.

Я могу отключить кэширование методов Java, установив системное свойство «sun.reflect.noCaches», но мое приложение стало невероятно медленным после того, как я изменил это свойство.

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

Что может решить эту проблему?

Какие обстоятельства могут вызвать утечку памяти (неправильный загрузчик классов, ...)?

Проект работает под Linux с использованием Java 1.5

1 Ответ

4 голосов
/ 22 июня 2011
  1. Во-первых, используемый кеш - это SoftReference , поэтому кэшированные методы будут удалены до того, как OOME когда-либо произойдет.

  2. Если вы все еще хотите удалить его, просто вызывайте метод clearCachesOnClassRedefinition() после каждого вызова getMethods(..); вам придется использовать рефлексию, так как метод закрыт.

...