Cuando creo un objeto, hay memoria nueva asignada a los campos y métodos de la instancia o solo a los campos de la instancia

13

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 los campos de instancia. ¿Ahora mi pregunta es si la memoria se asigna para métodos ( setResult y displayResult ) dos veces o una vez?

Consulte la siguiente figura y puede ayudarme a decir qué figura proporciona la información correcta.

    
pregunta Harish_N 18.09.2014 - 18:56

3 respuestas

12

El código para los métodos es parte de Class (más concisamente, Class<Student> ) y se carga en la memoria cuando la clase se carga por primera vez.

Dicho esto, cuando se 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, debería estar claro ahora que la figura B es correcta (aunque no refleja lo que sucede cuando realmente llama al método).

    
respondido por el SJuan76 18.09.2014 - 19:03
6

Los campos de instancia (incluidos los campos de respaldo de propiedad) obtienen N-copias para N-objetos.

Los campos estáticos obtienen una única 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 forman parte de la imagen del programa, ya que se encuentra en el disco. Una vez que la imagen es cargada por el sistema operativo (o CLR), hay una sola copia compartida del código del método.

No forman parte del "montón" o la asignación de tiempo de ejecución en general, excepto en los casos en los que puede utilizar el compilador de alojamiento 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 los 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 del código de bytes en el disco.

ACTUALIZACIONES por comentarios:

El estándar JVM tiene esto que decir:

  

2.5.4. Área de método

     

La máquina virtual de Java tiene un área de método que se comparte entre todos   Subprocesos de la máquina virtual de Java. El área del método es análoga a la   Área de almacenamiento para código compilado de un lenguaje convencional o análogo.   al segmento de "texto" en un proceso de sistema operativo. Se almacena   estructuras por clase, tales como el conjunto de constantes en tiempo de ejecución, el campo y   datos de métodos, y el código de métodos y constructores, incluyendo la   métodos especiales (§2.9) utilizados en la inicialización de clases e instancias y   Inicialización de la interfaz.

     

El área de método se crea en el inicio de la máquina virtual. Aunque el   El área de método es lógicamente parte del montón, implementaciones simples pueden   Elige no recolectar basura ni compactarla. Esta versión de   La especificación de la máquina virtual de Java no exige la ubicación   del área de método o las políticas utilizadas para administrar el código compilado. los   el área del método puede ser de un tamaño fijo o expandirse según lo requiera   El cálculo y se puede contratar si un área de método más grande se convierte en   innecesario. La memoria para el área de método no necesita ser   contiguo.

Así que está claro que (1) sí, la especificación no determina cómo se hace esto, 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.

    
respondido por el codenheim 18.09.2014 - 19:58
-4

objeto asignado en la memoria del montón.cuando al objeto se le asigna la ranura, toda la variable de la instancia se crea y se destruye cuando se destruye el objeto. también se asigna la variable de la instancia en la memoria del montón. hora en que se llama el método.

    
respondido por el Abhishek Tripathi 17.02.2016 - 18:30

Lea otras preguntas en las etiquetas