В Java функции-члены загружаются по запросу с помощью загрузчика классов. Поскольку вся стандартная библиотека Java доступна вместе с любой программой Java, а сама программа может содержать любое количество классов, это необходимо для того, чтобы время запуска программы оставалось в разумном диапазоне.
Таким образом, каждый раз, когда программе каким-либо образом требуется класс (например, для доступа к статической переменной или методу или для создания экземпляра объекта), который еще не загружен, загрузчик классов Java загружает этот класс, который включает в себя функции-члены класса. . Затем, как только этот класс загружен, его не нужно загружать снова, если он понадобится в будущем, потому что аналогично тому, что вы отметили в своем вопросе, в любой момент времени необходима только одна копия байт-кода класса.
Чтобы избежать накопления все большего количества загруженных классов по мере выполнения программы, Java использует сборку мусора для выгрузки классов, которые, как известно, можно безопасно выгрузить, подобно тому, как он использует сборку мусора для данных программы. Эти классы, конечно, могут быть перезагружены позже, если они понадобятся снова. Конечно, бывают ситуации, в которых выгрузка класса не сработает из-за риска того, что его повторная загрузка приведет к повторной инициализации/запуску статических переменных/кода.
Эту возможность выгружать и перезагружать классы также можно использовать при отладке: IntelliJ IDEA имеет Горячая замена, которая позволяет вам редактировать и перекомпилировать класс во время работы программы, выгружать этот класс, а затем перезагружать новый байт-код, чтобы вы могли быстро проверить идеи. (Вау, я только что понял, что это звучит как реклама. Я не связан с JetBrains, если вам интересно.)
person
Sam Estep
schedule
27.06.2015