Что произошло со статическим ЗУ в Java?

Я видел & amp; & amp; чрезмерное использование здесь при работе для операторов присваивания. Конкуренция двоякая: 1) Проверка индикатора иногда является функцией с накладными расходами, которые разработчики не учитывают. 2) Разработчики просто видят в нем проверку безопасности и не считают, что они присваивают ложные значения их var. Мне нравится, что у них есть тип безопасного типа, поэтому я их изменяю:

var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex();

:

var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex() || 0;

, поэтому они получают целое число, как ожидалось.

19
задан ForYourOwnGood 1 January 2009 в 19:40
поделиться

6 ответов

Импорт не коррелирует ни с какими инструкциями в скомпилированном коде. Они устанавливают псевдонимы для использования во время компиляции только.

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

Статические членские инициализаторы и статические блоки выполняются, как будто они были всем статический блок инициализатора в порядке исходного кода.

на объект, на который ссылаются через статическую членскую переменную, сильно ссылаются, пока класс не разгружен. Нормальное ClassLoader никогда не разгружает класс, но используемые серверами приложений делают при правильных условиях. Однако это - хитрая область и было источником многих твердо диагностируемая память leaks— еще одна причина не использовать глобальные переменные.

<час>

Как (тангенциальная) премия, вот хитрый вопрос рассмотреть:

public class Foo {
  private static Foo instance = new Foo();
  private static final int DELTA = 6;
  private static int BASE = 7;
  private int x;
  private Foo() {
    x = BASE + DELTA;
  }
  public static void main(String... argv) {
    System.out.println(Foo.instance.x);
  }
}

, Что это кодирует печать? Попробуйте его, и Вы будете видеть, что это печатает "6". Существует несколько вещей на работе здесь, и каждый - порядок статической инициализации. Код выполнен, как будто он был записан как это:

public class Foo {
  private static Foo instance;
  private static final int DELTA = 6;
  private static int BASE;
  static {
    instance = null;
    BASE = 0;
    instance = new Foo(); /* BASE is 0 when instance.x is computed. */
    BASE = 7;
  }
  private int x;
  private Foo() {
    x = BASE + 6; /* "6" is inlined, because it's a constant. */
  }
}
34
ответ дан 30 November 2019 в 02:48
поделиться

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

можно проверить это путем создания статического блока инициализатора. Поместите точку останова в этот блок инициализатора, и Вы будете видеть, когда это назовут. Или еще больше simplier... помещает точку останова в конструктора SomeObject.

3
ответ дан 30 November 2019 в 02:48
поделиться

Обычно нет никакой такой вещи как "статическая" память. Большая часть vm's имеет постоянное поколение "кучи" (где классы загружаются), который обычно не собирается "мусор".

Статические объекты выделяются точно так же, как любой другой объект. Но, если они будут долгое время жить, то они будут перемещены между различными поколениями в сборщике "мусора". Но они не закончат в permgenspace.

, Если Ваш класс содержит на этот объект постоянно, он будет только выпущен, когда vm выйдет.

5
ответ дан 30 November 2019 в 02:48
поделиться

Это должно быть отмечено, это, только указатель (или любой другой тип примитива) хранится в PermGenSpace (thats имя собственное для области, где статический материал хранится).

, Таким образом, Объект, на который ссылается указатель, находится в нормальной "куче", как любой другой объект.

2
ответ дан 30 November 2019 в 02:48
поделиться

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

Это мог также быть free'ed (даже если не обнуленный), если сам класс разгружен, и весь граф объектов сокращается из "кучи". Конечно, когда класс может быть разгружен, хорошая тема для хоста других вопросов... :)

0
ответ дан 30 November 2019 в 02:48
поделиться

Инициализация статических переменных покрыта Разделом 2.11 Статических Инициализатора из солнц спецификация JVM. Спецификация не определяет реализацию Сборки "мусора" однако, таким образом, я предполагаю, что правила сборки "мусора" для статических объектов будут варьироваться в зависимости от Вашего VM.

3
ответ дан 30 November 2019 в 02:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: