необходимость статических переменных и их накладных расходов на jvm - PullRequest
2 голосов
/ 01 июня 2011

Согласно концепции о статических членах, они создаются / загружаются в память при первом обращении к его классу.И они распространены среди всех экземпляров этого класса.Означает, что они не воссозданы и не реинициализированы и т. Д. Кроме того, к ним можно получить доступ только по имени класса.Нет необходимости создавать объекты для этого класса только для доступа к ним.

Теперь мои вопросы;

  1. Будут ли в памяти статические элементы до запуска приложения?даже если все экземпляры этого класса были собраны GC (сборщиком мусора).
  2. Для большого проекта, где 8-10 команд работают вместе, они не заботятся о кодировании чужой команды.Они могут создавать статические элементы в соответствии с их потребностями.Если все члены кэшируются в памяти, разве это не создаст накладных расходов на JVM?
  3. По умолчанию все члены интерфейсов являются STATIC, и использование интерфейсов во многих случаях хорошо.Но если я буду помнить мои вышеупомянутые вопросы, я все еще должен использовать интерфейсы?

Ответы [ 3 ]

6 голосов
/ 01 июня 2011

1) Статические члены отбираются только тогда, когда сам класс, который их определяет, собирается; это, в свою очередь, может произойти, только если собран определяющий ClassLoader. Это часто встречается в контейнерах веб-приложений и архитектурах плагинов.

2) Да, определение большого количества статических данных может быть плохой идеей. Но это как и многие другие вещи: хорошо, если вам это нужно, и плохо, если вы злоупотребляете этим. Просто используйте здравый смысл.

3) Опять же, интерфейс, который определил массив из тысячи строк, был бы плохой идеей, но, конечно, это обычно не то, что делают люди. Просто используйте здравый смысл. Нет (связанных с памятью) причин избегать статических переменных вообще.

1 голос
/ 01 июня 2011
  1. да. Никакой GC никогда не очистит статические переменные. Это важно, потому что иначе нельзя полагаться на значения, хранящиеся в статических переменных. Шаблоны проектирования, такие как "Singleton", основаны на статических переменных.

  2. Статические переменные принимают столько же mem, сколько и то же значение, которое хранится в переменной экземпляра, поэтому до тех пор, пока значение, хранящееся в переменной, действительно необходимо для аббревиатуры, в статических переменных нет особых накладных расходов на хранение. Но побочные эффекты, возникающие при использовании статических переменных, когда речь идет о безопасности потоков и т. Д., Следует рассматривать больше, чем проблемы с памятью.

  3. да. Но интерфейсы существуют для описания контракта между поставщиком и пользователем функциональности, а не для хранения каких-либо данных.

0 голосов
/ 01 июня 2011
  1. Нет, они собраны вместе с классом.

  2. Накладные расходы по сравнению с чем?Какая альтернатива?

  3. Да, но никто не сказал, что вы должны заполнить их статическими элементами.

...