Загрузка классов против создания объектов в Java - PullRequest
2 голосов
/ 20 августа 2010

Я очень смущен тем, сколько времени выделяется памяти для программ на Java.Это "частично сделано", когда класс загружен?Я прочитал жизненный цикл класса для загрузки-> ссылки-> инициализация-> выгрузки.Не будет ли потребляться некоторая память в этих процессах, даже если мы НЕ создаем объект этого класса?

Мне также интересно знать, был ли сделан шаг инициализации во время загрузки классов или создания объекта?

Большое спасибо!

Ответы [ 4 ]

7 голосов
/ 20 августа 2010

Перед тем, как вы сможете «использовать» экземпляр класса, необходимо выполнить три вещи, каждая из которых влечет за собой выделение кучи памяти:

  1. Байт-коды классов должныбыть загруженным и связанным для разрешения любых статических зависимостей от других классов.

  2. Класс должен быть инициализирован.

  3. Экземпляр потребностей классабыть созданным.

Загрузка и связывание классов обычно происходит при запуске JVM, хотя это может быть выполнено "лениво" JVM, и это может быть сделано динамически;например, используя Class.forName(...).Это когда память для классов "code" выделяется.

Инициализация класса обычно выполняется непосредственно перед первым использованием класса.(Точные детали изложены в JLS).Это когда память для статики классов будет выделена.

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

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

1 голос
/ 20 августа 2010

Есть память, которая используется виртуальной машиной, а затем есть память, которая используется объектами Java внутри виртуальной машины.Загрузчики классов, а также объекты Class занимают память, но память для конкретного экземпляра класса выделяется, когда вы создаете его с "новым" выражением.Но да, существует небольшой фиксированный объем служебной памяти для возможности ссылаться на конкретный тип и создавать его экземпляры.

0 голосов
/ 21 августа 2010

Я очень запутался со временем в какая память выделена для Java программы

Это потому, что нет времени. Выделение и освобождение памяти происходит непрерывно на протяжении всей жизни Java-программы.

0 голосов
/ 20 августа 2010

Jvm выделит память, когда вы выполните new, если только вы не вызываете метод static, и в этом случае он также создаст класс.

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