Tengo una clase siguiente
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);
}
}
Ahora creo dos objetos de tipo Estudiante de la siguiente manera
Student s1=new Student();
Student s2=new Student();
Ahora se asignan dos conjuntos diferentes de memoria para campos de instancia. Ahora mi pregunta es si la memoria se asigna para los métodos ( setResult
y displayResult
) dos o una vez.
Consulte la siguiente figura y ¿puede ayudarme a decir qué figura proporciona la información correcta?
java
object-oriented
memory
jvm
Harish_N
fuente
fuente
Respuestas:
El código para los métodos es parte de
Class
(más concisamenteClass<Student>
) y se carga en la memoria cuando la clase se carga por primera vez.Dicho esto, cuando ejecuta cualquier método, se utiliza memoria adicional para asignar memoria a parámetros, variables locales, resultados de expresiones temporales, valores de retorno, etc. Pero dicha memoria se asigna en la pila (la memoria utilizada al crear una nueva instancia se asigna en el montón .
Según su pregunta, debe quedar claro ahora que la figura B es correcta (aunque no refleja lo que sucede cuando realmente llama al método).
fuente
Los campos de instancia (incluidos los campos de respaldo de propiedad) obtienen N-copias para N-objetos.
Los campos estáticos obtienen una sola copia por clase.
Los métodos son bloques de bytecode (o después de JIT, bloques de instrucciones nativas) que forman parte del programa "imagen" o segmento de código ejecutable. Los métodos ya son parte de la imagen del programa, ya que se encuentra en el disco. Una vez que el sistema operativo (o CLR) carga la imagen, hay una única copia compartida del código del método.
No son parte de la asignación de "montón" o tiempo de ejecución en general, excepto en los casos en que puede utilizar el compilador hospedable para compilar nuevos métodos sobre la marcha. Los métodos no se "asignan" como objetos y no se "asignan" en relación con la creación del objeto. Simplemente existen como parte del programa antes de que un solo objeto sea instanciado. Incluso las lambdas / delegados no se asignan sobre la marcha. El compilador crea clases a pedido para implementar estos otros objetos de código aparentemente dinámicos, y también existen como parte de la imagen de código de bytes en el disco.
ACTUALIZACIONES por comentarios:
El estándar JVM tiene esto que decir:
Por lo tanto, está claro que (1) sí, la especificación no dicta cómo se hace, pero (2) es análoga al área de almacenamiento para el código compilado de un lenguaje convencional, es decir. El segmento de texto. Este es el punto que estoy haciendo.
fuente
objeto asignado en la memoria de almacenamiento dinámico. cuando se asignan los objetos, la ranura para toda la variable de instancia se crea y se destruye cuando se destruye el objeto. por lo tanto, la variable de instancia también se asigna en la memoria de almacenamiento dinámico. Se llaman método.
fuente