Java: статические методы

Когда я вызываю статический метод вроде:

Something.action();

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

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

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
0
2 837
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

Это не совсем так, хотя это разумная мысленная модель загрузки классов. Некоторые виртуальные машины будут динамически выгружать неиспользуемые классы, чтобы уменьшить размер резидентной памяти; однако такая оптимизация применяется только к очень длительным процессам и только на виртуальных машинах, которые ее реализуют.

Aaron Maenpaa 18.11.2008 16:24

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

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

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

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

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

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

Какие у вас были проблемы с "преждевременной" загрузкой указанных классов? Мне любопытно, что это за проблема.

matt b 18.11.2008 17:31

Проблема заключалась в том, что у нас были одни и те же библиотеки, работающие на сервере и на клиенте. Часть пути кода не будет использоваться на сервере, поэтому мы попытались удалить ненужные библиотеки, которые не вызывались. Даже если код не был вызван, приложение вылетало при запуске.

Guillaume 18.11.2008 18:07

Другие вопросы по теме