Final (Alocação de memória)

6 respostas
T

Fala galera.

Surgiu uma dúvida quanto ao uso da palavra reservada Final.

Ao utilizá-la, além da variável não alterar o valor em tempo de execução, existe alguma diferença da alocação de memória para variáveis não-final?

Por exemplo:

int x = 3;

final int y = 3;

O tamanho do espaço utilizado é o mesmo para ambos os casos ou a variável final utiliza menos espaço (apenas o necessário para armazenar o 3)?

6 Respostas

E

A diferença não está em usar “final” mas sim “static”.
“final int” != “static final int”.

T

Não é isso.

Static é outra coisa.

Static refere-se a posição de memória que não se altera.

Uma variável static pode alterar o valor durante a execução do programa, ela não altera é sua POSIÇÃO DE MEMÓRIA.
Tanto que você pode utilizar uma variável static de outra classe mesmo sem ter um objeto da classe.

E

Acontece que, em termos de alocação de memória, é haver o “static” ou não haver o “static” que importa.

Se você tem uma variável local marcada como final, por exemplo, ela continuará a estar alocada no stack, e se você tem uma variável de instância marcada como final, ela continuará a estar alocada no heap.

Uma pequena otimização que a JVM tem é o caso de constantes do tipo “static final int” ou algum outro tipo primitivo. Neste caso, e dependendo da situação, o compilador Java pode optar por codificar diretamente a constante nos bytecodes, em vez de usar uma referência a ela.

E

Outra coisinha que não lhe ensinaram direito.

Por causa da “garbage collection”, você nem pode supor que uma variável estática fique efetivamente paralisada em uma determinada posição de memória (e é por isso que aritmética de ponteiros é impossível em Java). Pode ser, por exemplo, que o objeto referenciado por essa variável estática seja movido para outra posição de memória, devido à garbage collection.

Portanto, nunca pense em posições de memória de forma “absoluta”, como você esté induzindo a gente a pensar. Digamos que uma variável estática (que melhor seria chamada “variável de classe” - como é o caso do Delphi, se não me engano) é uma variável que aponta para um objeto que é compartilhado por todas as instâncias da mesma classe.

T

De acordo com o livro Linguagens de Programação - Conceitos e Técnicas o static aloca posição em tempo de compilação e só libera no final da execução do programa.

Entao voce concorda que o Flavio Varejao autor do livro está errado?

link: http://www.inf.ufes.br/~fvarejao/livroLP.html

E

Alocar uma posição não quer dizer que essa posição fique fixa…

Na verdade, apenas para facilitar a implementação, no caso específico da Sun JVM, apenas a memória ocupada pelo código nativo compilado tem de ficar fixa. Como esse código é relativamente pequeno comparado com a quantidade de memória usada pelas aplicações Java típicas, a Sun optou por deixar essa área de memória sem poder ser movimentada livremente por algum “garbage collector”.

Não sei quem é esse Flávio Varejão, mas de qualquer maneira você sabe que é importante você simplificar os conceitos se você pretende ser didático (que é o caso do livro, oras!)

A liberação da memória de uma variável estática, por exemplo, pode ocorrer antes do final da execução de um programa, se por acaso:

  • A variável referenciar um objeto que não está sendo referenciado por mais nenhuma outra variável ou objeto no seu programa, e
  • A classe que define a variável estática for ela mesma descarregada da memória (isso é possível, principalmente se ela for carregada por um classloader que não é o padrão.)

Portanto, a realidade pode ser mais complicada que parece. Aconselho a estudar outras coisas que não somente seu livro.

Criado 24 de junho de 2010
Ultima resposta 24 de jun. de 2010
Respostas 6
Participantes 2