У меня следующий класс
class Student{
int rollNumber;
int marks;
public void setResult(int rollNumber, int marks){
this.rollNumber=rollNumber;
this.marks=marks;
}
public void displayResult(){
System.out.println("Roll Number= "+this.rollNumber+" Marks= "+this.marks);
}
}
Теперь я создаю два объекта типа Student следующим образом
Student s1=new Student();
Student s2=new Student();
Теперь два разных набора памяти выделены для полей экземпляра. Теперь мой вопрос заключается в том, выделяется ли память для методов ( setResult
и displayResult
) дважды или один раз?
Пожалуйста, посмотрите на следующий рисунок, и вы можете помочь мне сказать, какая цифра дает правильную информацию.
java
object-oriented
memory
jvm
Harish_N
источник
источник
Ответы:
Код для методов является частью
Class
(более краткоClass<Student>
) и загружается в память при первой загрузке класса.Тем не менее, при выполнении любого метода используется дополнительная память, чтобы выделить память для параметров, локальных переменных, результатов временных выражений, возвращаемых значений и так далее. Но такая память выделяется в стеке (память, используемая при создании нового экземпляра, выделяется в куче .
Что касается вашего вопроса, теперь должно быть ясно, что фигура B верна (хотя она не отражает того, что происходит, когда вы на самом деле вызываете метод).
источник
Поля экземпляра (включая поля поддержки свойств) получают N-копии для N-объектов.
Статические поля получают одну копию для каждого класса.
Методы - это блоки байт-кода (или после JIT, блоки нативных инструкций), которые являются частью «образа» программы или сегмента исполняемого кода. Методы уже являются частью образа программы, поскольку она находится на диске. Как только изображение загружено ОС (или CLR), существует одна общая копия кода метода.
Они не являются частью "кучи" или выделения времени выполнения в целом, за исключением случаев, когда вы можете использовать размещаемый компилятор для компиляции новых методов на лету. Методы не «распределяются» как объекты и не «распределяются» относительно создания объекта. Они просто существуют как часть программы, прежде чем когда-либо будет создан единственный объект. Даже лямбды / делегаты не распределяются на лету. Компилятор создает классы по требованию для реализации этих других, казалось бы, динамических объектов кода, и они также существуют как часть образа байт-кода на диске.
ОБНОВЛЕНИЯ за комментарии:
Стандарт JVM имеет следующее:
Таким образом, ясно, что (1) да, спецификация не диктует, как это делается, но (2) она аналогична области хранения для скомпилированного кода обычного языка, т.е. текстовый сегмент. Это точка, которую я делаю.
источник
Объект, выделенный в куче памяти. Когда объекту выделяется слот для всех переменных экземпляра, создается и уничтожается при уничтожении объекта. Поэтому переменная экземпляра также размещается в памяти кучи. И локальная переменная создается в стеке во время, когда метод называется.
источник