2008-11-18 6 views
5

Когда я вызываю статический метод как:Java: `static` Методы

Something.action(); 

Поскольку экземпляр не будет создан, как долго будет класс статический метод состоится в памяти?

Если я вызываю тот же метод, будет перезагружаться класс для каждого вызова, поскольку экземпляр не существует?

И только отдельные статические методы загружаются при вызове или все методы и статические методы класса, загруженного в память, хотя может использоваться только один статический метод?

ответ

11

Если вы не настроили сборку мусора из области permgenspace, класс останется в памяти до тех пор, пока не исчезнет vm. Полный класс загружается всеми статическими методами.

+0

Это не совсем так, хотя это разумная ментальная модель загрузки классов. Некоторые виртуальные машины будут динамически выгружать неиспользуемые классы, чтобы уменьшить размер резидентной памяти; однако такая оптимизация будет работать только с очень длительными процессами и только на виртуальных машинах, которые ее реализуют. – 2008-11-18 13:24:36

4

Класс остается в памяти до тех пор, пока загрузчик классов, загружающий этот класс, не останется в памяти. Итак, если класс загружается из загрузчика системного класса, класс никогда не разгружается, насколько мне известно.

Если вы хотите выгрузить класс, вам нужно:

  1. Загрузите класс и все классы, которые относятся к этому классу, используя специальный загрузчик классов
  2. После того как вы сделали с этим классом, выпуск все ссылки на класс - то есть убедитесь, что нет экземпляров объекта этого класса около
  3. Выгрузите класс и все классы, ссылающиеся на него, выпустив экземпляр пользовательского класса, загружающий эти классы.
1

Класс Класс должен загружаться при загрузке класса вызывающего абонента. И он остается там до выхода VM, как сказал крозенвольд.

2

В некоторых конфигурациях класс даже загружен перед выполнением вызова. Мы использовали BES (Borland Enterprise Server), и у нас были проблемы с нашими серверами производства Solaris, где все ссылочные классы, где рекурсивно загружались при запуске нашего приложения. Это означает, что когда основной класс нашего приложения был загружен, сервер приложений загрузил весь класс, указанный в разделе импорта этого класса ... рекурсивно.

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

+0

Каковы были некоторые из проблем, с которыми вы столкнулись, когда загруженные классы загружаются «преждевременно»? Мне любопытно, что это за проблема. – 2008-11-18 14:31:31