Выделение памяти для объектов в java

Я новичок в Java, и я закончил C++. В C++ выделение памяти для функций-членов выполняется во время их объявления как части класса, а не при создании объектов, когда создаются объекты, тогда выделяется только память для переменных экземпляра. сделано, то есть для каждого объекта выделение памяти для переменной экземпляра выполняется отдельно, а функции-члены совместно используются всеми объектами. Я знаю, что в случае с переменными экземпляра происходит то же самое в java, но что происходит в случае с функциями-членами?

В С++; Например, если у нас есть 2 переменные экземпляра a и b, и мы создали 3 объекта x, y, z и скажем, что у нас есть функция-член getData(), тогда все 3 объекта имеют отдельную копию двух переменных экземпляра a и b, но делитесь общей копией getData().

Например, переменные, то же самое и в java, но что для функций-членов?


person Frosted Cupcake    schedule 27.06.2015    source источник


Ответы (2)


В Java байт-код для методов существует только один раз для класса; для каждого объекта не создается копия байт-кода метода. Это было бы ненужным и расточительным; байт-код не меняется во время работы программы.

Так что это работает так же, как вы говорите для С++:

... функции-члены совместно используются всеми объектами.

person Jesper    schedule 27.06.2015

В Java функции-члены загружаются по запросу с помощью загрузчика классов. Поскольку вся стандартная библиотека Java доступна вместе с любой программой Java, а сама программа может содержать любое количество классов, это необходимо для того, чтобы время запуска программы оставалось в разумном диапазоне.

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

Чтобы избежать накопления все большего количества загруженных классов по мере выполнения программы, Java использует сборку мусора для выгрузки классов, которые, как известно, можно безопасно выгрузить, подобно тому, как он использует сборку мусора для данных программы. Эти классы, конечно, могут быть перезагружены позже, если они понадобятся снова. Конечно, бывают ситуации, в которых выгрузка класса не сработает из-за риска того, что его повторная загрузка приведет к повторной инициализации/запуску статических переменных/кода.

Эту возможность выгружать и перезагружать классы также можно использовать при отладке: IntelliJ IDEA имеет Горячая замена, которая позволяет вам редактировать и перекомпилировать класс во время работы программы, выгружать этот класс, а затем перезагружать новый байт-код, чтобы вы могли быстро проверить идеи. (Вау, я только что понял, что это звучит как реклама. Я не связан с JetBrains, если вам интересно.)

person Sam Estep    schedule 27.06.2015
comment
Если загрузчик классов java загружает класс каждый раз, класс необходим, то почему статический блок инициализируется один раз в программе? - person Frosted Cupcake; 27.06.2015