Eu tenho uma turma seguinte
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);
}
}
Agora eu crio dois objetos do tipo Student da seguinte maneira
Student s1=new Student();
Student s2=new Student();
Agora, dois conjuntos diferentes de memória são alocados para os campos da instância. Agora, minha pergunta é se a memória é alocada para os métodos ( setResult
e displayResult
) duas ou uma vez?
Consulte a figura a seguir e você pode me ajudar a dizer qual figura fornece as informações corretas.
java
object-oriented
memory
jvm
Harish_N
fonte
fonte
Respostas:
O código para métodos faz parte do
Class
(de forma mais concisa,Class<Student>
) e é carregado na memória quando a classe é carregada pela primeira vez.Dito isto, quando você executa qualquer método, é usada memória adicional para alocar memória a parâmetros, variáveis locais, resultados de expressões temporárias, valores de retorno e assim por diante. Mas essa memória é alocada na pilha (a memória usada ao criar uma nova instância é alocada na pilha .
Conforme sua pergunta, deve ficar claro agora que a figura B está correta (embora não reflita o que acontece quando você realmente chama o método).
fonte
Os campos de instância (incluindo campos de propriedade) recebem N-cópias para N-objetos.
Os campos estáticos recebem uma única cópia por classe.
Métodos são blocos de bytecode (ou após JIT, blocos de instruções nativas) que fazem parte da "imagem" do programa ou do segmento de código executável. Os métodos já fazem parte da imagem do programa, pois fica no disco. Depois que a imagem é carregada pelo sistema operacional (ou CLR), há uma única cópia compartilhada do código do método.
Eles não fazem parte da "pilha" ou da alocação de tempo de execução em geral, exceto nos casos em que você pode usar o compilador hostável para compilar novos métodos em tempo real. Os métodos não são "alocados" como objetos e não são "alocados" em relação à criação do objeto. Eles meramente existem como parte do programa antes que um único objeto seja instanciado. Mesmo lambdas / delegados não são alocados em tempo real. O compilador cria classes sob demanda para implementar esses outros objetos de código aparentemente dinâmicos e eles também existem como parte da imagem do bytecode no disco.
ATUALIZAÇÕES por comentários:
O padrão da JVM tem o seguinte a dizer:
Portanto, é claro que (1) sim, a especificação não determina como isso é feito, mas (2) é análogo à área de armazenamento para código compilado de uma linguagem convencional, ou seja. o segmento de texto. Este é o ponto que estou afirmando.
fonte
objeto alocado na memória heap. quando o objeto é alocado, o slot para toda a variável de instância é criada e destruída quando o objeto é destruído. a variável de instância também é alocada na memória heap. E a variável local é criada na pilha no momento em que o método é chamado.
fonte