Oi Turma!!!
Alguém aí poderia me dizer como eu faço pra desalocar memória no java?
Tem alguma classe que faz isso?
Alguém pode me dar uma luz??? :idea:
Aguardo qualquer ajuda…
Patricia
Oi Turma!!!
Alguém aí poderia me dizer como eu faço pra desalocar memória no java?
Tem alguma classe que faz isso?
Alguém pode me dar uma luz??? :idea:
Aguardo qualquer ajuda…
Patricia
patricia…
vc pode chamar o Garbage Colector…System.gc();
mas ele jah automaticamente chamado pela JVM…
Como o Garbage Colector sabe quais serão os objetos que ele precisa limpar? Como faço para chamar isso? :lol:
Ola Patricia,
na JVM existe o garbage collector, quando vc aponta a referencia de um objeto para null, por exemplo
Pessoa p = new Pessoa();
p = null;
automaticamente a memoria sera desalocada.
Agora nesse caso:
Pessoa p = new Pessoa();
Pessoa p1 = p;
p = null;
O objeto nao sera coletado pq a referencia “p1” ainda aponta para o objeto.
[Obs]
O gc passa apenas quando ele acha que deve, caso vc queira dizer para o gc que agora eh uma boa hora para passar vc pode fazer assim:
System.gc();
Mesmo vc chamando NAO quer dizer que ele ira executar, ele soh passa quando acha necessario.
A jre tem a possibilidade de configuracao de gc, ai vc pode otimizar a execucao dele veja mais em:
http://java.sun.com/docs/hotspot/gc/index.html
Abraco,
Valeu pela ajuda…
Bjs
Kual a funcionalidade de deslocar memória num programa???
Desculpe minha ignorância…
Bom Amigo,
a memoria do seu computador eh limitada, por exemplo RAM: 128MB, os programas abertos, arquivos, variaveis etc., vao consumindo essa memoria, agora vamos supor que vc abra 10 programas e que cada um utilize durante seu funcionamento normal 20mb de memoria, ja seria im possivel que rodassem soh com esses 128 correto?
E eh isso que acontece com sistemas operacionais mais antigos, sistemas operacionais mais novos utilizam a chamada memoria virtual, quando a RAM fica cheia eles comecam a usar uma area do HD como uma memoria de mentira(virtual).
Soh que a memoria virtual eh uma carrocha perto da memoria ram, logo eh importante que nos programadores utilizemos de maneira eficiente a memoria, então se não esta utilizando aquela variavel, vamos desaloca-la, se nao vou mais mexer naquele arquivo, vou fecha-lo e etc.
Abraco,
Não é deslocar, é desalocar…
Vc faz isso porque pode estar ocupando memória com objetos que não usa mais… então, liberando esses objetos, vc ganha mais memória…
Entendeu???
tem algum tutorial manero sobre esse assunto ???
naum sabia desse dispositivo… assim eu posso tornar meu aplicativo mais leve e mais rápido e portátil… ou tô errado???
Eh…, mais leve e rapido, portatil eh do java
Cara a coisa eh mais ou menos essa de apontar para nulo, fechar arquivo, fechar resultset etc.
Com o tempo naturalmente vc percebe essas coisas, tudo o que vc usa em um programa eh um recurso e tem um custo, seja armazenamento seja tempo de processamento.
Seria legal dar uma olhada em um livro de Sistemas Operacionais para entender melhor esse esquema de memoria, Threads, recursos etc., que sao fundamentais para um programador.
Recomendo esse: Sistemas Operacionais
autor: abraham silberschatz & greg gagne & peter baer galvin
editora:Campus
ISBN: 8535207198
http://www.campus.com.br/script/CpsDetalhe.asp?pIntCodProduto=20719&pStrArea=0
Abraco,
tipo ess de fechar arquivo e fechar o resultset eu sempre faço… mas por instinto… mas criar objeto com null… isso eu naum sabia… todo objeto q eu criar eu mando um null nele???
Saiu um artigo interessante sobre esse assunto na Core Java Technology Tech Tips dessa semana, comparando um pouco o mecanismo no Java com o do C++.
Java é algo que você não precisa ficar totalmente neurótico em relação ao gerenciamento de memória, porque em geral o Garbage Collector cuida de tudo para você. Se o objeto estiver referenciado apenas por variáveis locais, quando terminar todos os métodos que estão usando elas o objeto já vai ficar livre para ser coletado automaticamente. Se for variável de instância, fica livre quando o objeto que tem essa variável também estiver livre. E por aí vai… Mas claro que dar uma “ajudinha” colocando null no que você não estiver mais usando, etc, acaba sendo uma boa prática.
Isso especificamente em relação a memória. Em relação a outros recursos, como foi citado, especialmente os de banco de dados (que costumam ser limitados), é bem importante estar sempre atento a fechar os statements, conexões, etc. para não ficar dependendo do garbage collector passar.
Nunca esquecendo que voce nao pode forcar o desalocamento de memoria, mas sim apenas sugerir que o GC rode, o que pode acontecer logo, acontecer muito tempo depois ou nunca acontecer.
No geral, setar um objeto para null facilita um pouco as coisas para o GC, mas nao garante que o objeto sera coletado imediatamente.
Rafael
Vale lembrar também que a VM Classica se comporta bem diferente que a VM HotSpot, e a “limpeza” pode acontecer em vários momentos ou não acontecer.
E realmente o que importa é lembrar de fechar todos os acessos a recursos de IO, JNDI, JDBC, RMI, IIOP, CORBA, etc…
Dentro de laços, não tem efeito algum apontar uma referência para “null”, pois o interpretador otimiza o seu uso podendo reaproveitar endereços de memória.
ex:
Object obj[] = …
for ( int i =0; i< obj.length; i++) {
Object obj = obj[i];
obj.toString();
obj = null; // não server pra nada!
System.gc(); // nunca vai funcionar, e ainda criará OverHead.
}
obj[] = null; // tudo bem, o GC saberá que terá que coletar essa referência e seus objetos;
[]´s
bom estudo
Patricia e Rbarioni, vamos aos pontos
A alocacao e desalocacao de memoria eh controlada pela virtual machine e voce nao tem acesso a tal parte do programa
Os algoritmos usados para o Garbage Collector descobrir quem ja esta inutil nao sao tao simples, ele percorre todos os objetos na memoria e prepara pra apagar aqueles que nao sao mais apontados por nenhum objeto VIVO. objeto vivo eh aquele objeto que eh apontado por algum outro objeto, isto eh, ele vai apagar aqueles que nao estao sendo usados por alguma thread nao daemon no final das contas… ciclos de apontamentos nao irao salvar seu objeto de ir pro lixo
existem tutoriais e tutoriais sobre como trabalhar com o garbage collector, aqui no guj mesmo se nao me engano tem um que comecei e meu irmao terminou
existem pencas de implementacoes de garbage collectors por ai, escolha o seu
own_prison: nao soh fica tudo mais facil como tambem voce evita leaks de memoria (apesar de ser capaz de faze-los ainda), uma vez que se o objeto nao esta sendo usado vc nao precisa se preocupar em desalocar a memoria, isso sera feito sozinho (diferente de C/C++/Visual Basic/…, onde eh facinho perder memoria)
Sabe quando voce abre o microsoft word e ai fecha e sobra menos memoria ram livre do q antes? e q se voce abrir e fechar 50 vezes sobra bem menos? pq? pq programas mal feitos nao liberam toda a memoria que usaram, pq programadores mal instruidos esquecem de desalocar a memoria java ajuda e nao deixa agente fazer dessas
nao serve pra QUASE NADA igualar o objeto a null se voce programou bonitinho. primeiro que sera uma instrucao a mais pro interpretador java rodar… ele ira jogar um null no objeto… a mesma coisa com inicializadores de classe null:
Object obj;
Object obj2 = null;
A primeira chamada gera uma instrucao
A segunda chamada gera duas instrucoes… perda de tempo… resultado eh o mesmo (para membros de classe)
Igualar o objeto a null para que ele seja coletado soh ajuda se o objeto ao qual ele pertence nao sera coletado… por exemplo variaveis membros de um objeto que nao sera coletado. Variaveis dentro de um metodo serao coletadas de qq jeito quando o metodo acabar, portanto setar ele a null eh perda de tempo.
Se nao me engano o garbage collector eh ate mesmo opcional, o que nao soh nao garante que ele nao vai rodar como pode ser que ele nao exista
mas relaxa, isso soh acontece com as tiny virtual machines (as do lego num eh?) e coisas do genero
A questao do loop, ja li em algum lugar que o compilador soh vai usar o mesmo apontador se voce declarar o objeto para fora do loop:
Object object = null;
for ( int i =0; i< obj.length; i++) {
object = obj[i];
}
Se o compilador otimiza o exemplo do Oziel para criar o codigo acima eu nao sei dizer mesmo… preciso descobrir onde li sobre o codigo acima…
Guilherme Silveira
Eitcha… tem uma sutileza aí…
uma coisa é uma atribuição, outra é uma inicialização. Por exemplo:
String s;
s = "Duke';
Isso é mais caro do que
String s = "Duke";
Hoje em dia, o javac é bem esperto, e se vc mandar ele otimizar tudo o que ele vir pela frente (acho que é -o a opção, ou optimize=“true” no ant), ele identifica essas coisinhas a transforma a primeira na segunda.
Qual a diferença? O segundo código faz uma chamada de inicialização, o conteúdo da string é passado para ela no momento da construção, com manipulação direta de memória, enquanto o código de cima faz uma atribuição normal. O código de cima faz o equivalente a:
String s = null;
s = "Duke";
Com inteiros funciona igual:
int i;
i = 1;
// equivale a
int i = 0;
i = 1;
// é preferível usar:
int i = 1;
90% das vezes, isso não é o gargalo de nada. IO demora mais, repaint() demora mais, geração de AWTEvents causa mais impacto. Tem muita coisa pra vc olhar antes de pensar nesses detalhes.
Inclusive, eu quero fazer uma aposta com a Patrícia. O Java tem uma opção de logar o uso do GC num arquivo. Faça alguns testes e me diga se a sua coleta “forçada” ajudou alguma coisa. Eu aposto que não mudou nada na performance observada.
[]s