Espaço em memória

4 respostas
C

Ao declarar uma referência, o JVM reserva espaço na memória para ela, certo?

Dog d = new Dog();

Aqui há uma referência d de um objeto Dog.

Se este objeto Dog fica sem referências, o GB dá cabo dele.

Mas e a referência em si? Como dar cabo dela?

Mesmo que eu diga:

Dog d = null;

Ainda há uma referência d, que ocupa lugar na memória, mesmo sem estar referenciando objeto algum, não há?

4 Respostas

E

A referência em si (que tem 4 bytes em uma JVM de 32 bits e 4 ou 8 bytes em uma JVm de 64 bits) faz parte de:

a) Um outro objeto (se for uma variável de instância desse objeto) - nesse caso,  se o objeto em si for limpo;

b) Está na pilha (como uma variável local) - nesse caso nem levamos em conta na hora de contabilizar memória,  que está na pilha, e quando a rotina que tiver essa variável local retornar, essa memória será devolvida;

c) É uma variável estática, portanto faz parte da classe em si. Nesse caso,  se a classe em si for coletada, o que pode ocorrer quando você define um classloader customizado.

Não se preocupe “muito” com a referência.

C

E se a referência é declarada no main?
Só vai deixar de ocupar espaço na memória quando o programa for encerrado?
Não tem meios de eu intervir e destruí-la??

C

Alguém sabe?

E

cake:
E se a referência é declarada no main?
Só vai deixar de ocupar espaço na memória quando o programa for encerrado?
Não tem meios de eu intervir e destruí-la??

public static void main (String[] args) {
    String referencia = Integer.valueOf (12345); // aqui temos uma referência ao objeto String "12345"
    referencia = null; // aqui a referência tornou-se nula, então o objeto String pode ser coletado
    // Quando sair dessa rotina, a variável "referência", que é uma variável local, não existirá mais. 
}

A referência deixa de ocupar espaço na pilha (se for uma variável local) quando o escopo em que for declarada for fechado. Exemplo:

public static void main (String[] args) {
    for (int i = 0; i < 10; ++i) {
        String referencia = Integer.valueOf (12345); // aqui temos uma referência ao objeto String "12345"
        referencia = null; // aqui a referência tornou-se nula, então o objeto String pode ser coletado
        // Quando sair do escopo do "for", a variável "referência", que é uma variável local, não existirá mais. 
    }
}
Criado 13 de outubro de 2010
Ultima resposta 14 de out. de 2010
Respostas 4
Participantes 2