Java: `статические` методы - PullRequest
5 голосов
/ 18 ноября 2008

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

Something.action();

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

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

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

Ответы [ 4 ]

11 голосов
/ 18 ноября 2008

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

4 голосов
/ 18 ноября 2008

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

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

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

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

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

1 голос
/ 18 ноября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...