Сколько времени java-класс находится в памяти - PullRequest
2 голосов
/ 23 февраля 2010

Я думаю о том, сколько класса находится в памяти, если к нему не обращаются другие объекты в памяти?

например, предположим, у меня есть такой класс:

public class OrderNumber {
 private static long counter = 0;

 public static long getOrderNumber(){
          if (counter >= 100) {
            return counter = 1;
          }
          return ++counter;
 }
}

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

long number = OrderNumber.getOrderNumber(); 

каждый раз, когда я звоню, он возвращает инкрементный номер, 1, 2, 3, 4, ...

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

Ответы [ 4 ]

10 голосов
/ 23 февраля 2010

Прямо сейчас, ответ навсегда. Определения классов помещаются в постоянное поколение и остаются там до завершения программы.

Обратите внимание, что это проблема для динамических языков в JVM, таких как JRuby, которые создают классы на лету, потому что эти классы занимают пространство. Я полагаю, что есть изменения в работах, которые решат эту проблему - например, G1 коллектор

3 голосов
/ 23 февраля 2010

Определено, что существует эффективная сильная ссылка от класса на его экземпляр загрузчика классов и от экземпляра загрузчика классов на каждый класс, который он когда-либо загружал. Таким образом, класс может быть выгружен только одновременно с загрузчиком классов (дайте или возьмите нечетный трюк воскрешения финализатора). Каждый класс, загруженный загрузчиком классов, получает право на коллекционирование одновременно.

На практике данные класса живут в «постоянном поколении» (по крайней мере, в HotSpot). Обычно это мусор, собираемый реже, чем основная куча, так как он должен иметь меньше оттока. Для загрузчиков классов также не редкость «утечка». Большинство приложений имеют код, который сохраняется до перезапуска процесса. Серверы приложений для разработки часто перезагружают «приложения», сохраняя при этом основной сервер / контейнер и некоторый код библиотеки.

IIRC, JDK 1.1 выгружал отдельные классы, что вызывало проблемы (Java 2 вышла в 1998 году).

2 голосов
/ 23 февраля 2010

Там много информации о загрузке классов. Вот, к примеру, одна статья: http://www.ibm.com/developerworks/java/library/j-dyn0429/

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

Вот спецификация JVM для загрузки. http://java.sun.com/docs/books/jvms/second_edition/html/ConstantPool.doc.html

2 голосов
/ 23 февраля 2010

Документация Java действительно говорит навсегда: http://java.sun.com/docs/books/tutorial/java/javaOO/classvars.html

Они связаны с классом, а не с любым объектом. Каждый экземпляр класса совместно использует переменную класса, которая находится в одном фиксированном месте в памяти

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