Когда я вызываю статический метод вроде:
Something.action();
Поскольку экземпляр не создается, как долго класс статического метода будет храниться в памяти?
Если я вызову тот же метод, будет ли класс перезагружаться для каждого вызова, поскольку экземпляра не существует?
И загружаются ли только отдельные статические методы при вызове или все методы и статические методы класса загружаются в память, даже если может использоваться только один статический метод?




Если вы не настроили сборку мусора для permgenspace, класс остается в памяти до выхода из виртуальной машины. Полный класс загружен всеми статическими методами.
Класс остается в памяти до тех пор, пока загрузчик классов, загрузивший этот класс, не останется в памяти. Итак, если класс загружается из системного загрузчика классов, насколько мне известно, он никогда не выгружается.
Если вы хотите выгрузить класс, вам необходимо:
Класс Что-нибудь должен загрузиться, когда будет загружен класс вызывающего абонента. И остается там до выхода из ВМ, как сказал Кросенволд.
В некоторых конфигурациях класс загружается даже до того, как вы сделаете вызов. Мы использовали BES (Borland Enterprise Server), и у нас возникла проблема с нашими производственными серверами Solaris, где все упомянутые классы загружались рекурсивно при запуске нашего приложения. Это означает, что когда был загружен основной класс нашего приложения, сервер приложения загрузил весь класс, указанный в разделе импорта этого класса ... рекурсивно.
В качестве побочного примечания, если вы не работаете в среде с очень ограниченным объемом памяти или если вы загружаете много-много ненужных классов, вам не следует слишком заботиться об использовании памяти классами, загруженными в память.
Какие у вас были проблемы с "преждевременной" загрузкой указанных классов? Мне любопытно, что это за проблема.
Проблема заключалась в том, что у нас были одни и те же библиотеки, работающие на сервере и на клиенте. Часть пути кода не будет использоваться на сервере, поэтому мы попытались удалить ненужные библиотеки, которые не вызывались. Даже если код не был вызван, приложение вылетало при запуске.
Это не совсем так, хотя это разумная мысленная модель загрузки классов. Некоторые виртуальные машины будут динамически выгружать неиспользуемые классы, чтобы уменьшить размер резидентной памяти; однако такая оптимизация применяется только к очень длительным процессам и только на виртуальных машинах, которые ее реализуют.