| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/04/2011 11:17:16
|
neno
Debugger
![[Avatar]](/images/avatar/fe3160ea7e3092ca593f36717280ea2f.jpg)
Membro desde: 05/01/2010 17:20:22
Mensagens: 69
Localização: Hell de Janeiro - RJ
Offline
|
Pessoal, ajudem em uma duvida
Se eu tenho um looping que roda um determinado numero de vezes, e toda vez que eu passe nesse looping eu instancio um objeto, o que acontece com o mesmo no proximo looping?
ex:
O que a contece, a refeência vão acumulando na memória? Aquele espaço namemoria que aloquei na passa anterior é liberado quando eu dou um new Objeto()?
O GC é acionado? duvidas, duvidas...
|
Buscando SCWCD...
SCJP 6.0 Ok
Homens de preto o que é que você faz?!
- Eu crio códigos que assusta o satanás!!
Homens de preto qual é sua missão?!
-É programar em java e tirar certificação!! |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/04/2011 11:24:04
|
pango
Virtual Machine Man
Membro desde: 20/08/2005 16:31:37
Mensagens: 556
Localização: Pangolândia
Offline
|
A cada iteração, um novo objeto é carregado na memória. O anterior fica desreferenciado e, portanto, torna-se elegível para ser coletado pelo GC. Mas atenção: isto não significa que ele será imediatamente coletado.
Por este motivo, a instanciação de objetos dentro de loops é considerada má prática. Faça isto somente quando for absolutamente necessário.
|
programmer.setFucked(user.isStupid());
Sun Certified Java Programmer 1.4 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/04/2011 12:06:54
|
Adelar
GUJ Master
![[Avatar]](/images/avatar/4ad38ecf2884a47a5efa657f3358e635.jpg)
Membro desde: 31/10/2008 10:07:36
Mensagens: 1237
Localização: Cascavel
Offline
|
O GC é acionado em intervalos de tempo. Se houverem objetos que não são referenciados no programa estes serão desalocados, nestes períodos que o GC é chamado. Assim, chamando new não significa que será chamado o GC, a não ser que tenha chegado ao limite de memória, daí o GC será chamado automaticamente para tentar liberar memória para o novo objeto.
[]'s
|
"Errando e aprendendo com os bugs"
http://www.cajuscript.org |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/04/2011 12:20:01
|
InicianteJavaHenrique
GUJ Ranger
![[Avatar]](/images/avatar/6689263e6df1fbd89377d1dac02f87b0.png)
Membro desde: 16/02/2011 12:20:00
Mensagens: 784
Localização: São Vicente - SP
Offline
|
pango wrote:A cada iteração, um novo objeto é carregado na memória. O anterior fica desreferenciado e, portanto, torna-se elegível para ser coletado pelo GC. Mas atenção: isto não significa que ele será imediatamente coletado.
Por este motivo, a instanciação de objetos dentro de loops é considerada má prática. Faça isto somente quando for absolutamente necessário.
Bom saber faço isto direto No caso e se eu chamar uma conexão com BD (fora de um loop) e não mandar finalizar (porque não sei, tentei com try-catch e no finally coloquei conexaoBD.close e não deu certo) todas as conexões ficam na RAM ou quando chamo outra a anterior é anulada e libera memória?
|
Jogo de Xadrez com I.A feito em Java 2D. - HFS Softwares
"Felizes os Tópicos que estavam aqui neste dia: 07/12/2008, neste horário: 22:11:56 e neste local." - Henrique Ferreira da Silva
"O negócio de software é binário, você é 1 ou 0, vivo ou morto." - Filme Ameaça Virtual
"Existem 10 tipos de pessoas no mundo: as que entendem binário e as que não entendem."
"Compartilhar conhecimentos é uma forma de alcançar a imortalidade." - Dalai Lama
"Aquele que pergunta é um tolo por cinco minutos, mas aquele que não pergunta permanece um tolo para sempre." - Provérbio Chinês
"O topo da inteligência é alcançar a humildade." - Textos Judaicos
"Os computadores são incrivelmente rápidos, precisos e burros; Os homens são incrivelmente lentos, imprecisos e brilhantes; Juntos, seus poderes ultrapassam os limites da imaginação." - Albert Einstein
/**
*
* Programador Java
* @author Henrique Ferreira da Silva
* @since Julho/2010
*
*/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/04/2011 12:48:36
|
pango
Virtual Machine Man
Membro desde: 20/08/2005 16:31:37
Mensagens: 556
Localização: Pangolândia
Offline
|
InicianteJavaHenrique wrote:
pango wrote:A cada iteração, um novo objeto é carregado na memória. O anterior fica desreferenciado e, portanto, torna-se elegível para ser coletado pelo GC. Mas atenção: isto não significa que ele será imediatamente coletado.
Por este motivo, a instanciação de objetos dentro de loops é considerada má prática. Faça isto somente quando for absolutamente necessário.
Bom saber  faço isto direto  No caso e se eu chamar uma conexão com BD (fora de um loop) e não mandar finalizar (porque não sei, tentei com try-catch e no finally coloquei conexaoBD.close e não deu certo) todas as conexões ficam na RAM ou quando chamo outra a anterior é anulada e libera memória?
Cara,
A sua chamada a conexaoBD.close() dentro do finally não funcionou porque este método também lança uma exceção. Por este motivo, ele próprio deve estar dentro de um try/catch:
Por fim, uma dica: conexões são extremamente caras para se criar, tanto em termos de tempo quanto de uso de processador. Por este motivo, recomenda-se que:
1) Em aplicações JEE, se utilize um pool de conexões gerenciado pelo container;
2) Em aplicações JSE, se crie uma única conexão (durante a inicialização do programa, por exemplo), que será fechada no encerramento do programa.
|
programmer.setFucked(user.isStupid());
Sun Certified Java Programmer 1.4 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/04/2011 13:03:50
|
Jose111
JavaGuru
![[Avatar]](/images/avatar/0ff1a2dc87696229db870be7c0781faa.jpg)
Membro desde: 06/04/2009 13:20:32
Mensagens: 211
Localização: Depois do System.exit(0);
Offline
|
2) Em aplicações JSE, se crie uma única conexão (durante a inicialização do programa, por exemplo), que será fechada no encerramento do programa.
Em aplicações JSE também é recomendado usar pool de conexões, já que em determinados momento uma unica conexão não será suficiente e o tempo gasto para criar novas conexões é muito grande assim atrapalhando na perfomace da aplicação.
|
vocedeviaestarprogramando |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/04/2011 13:33:59
|
pango
Virtual Machine Man
Membro desde: 20/08/2005 16:31:37
Mensagens: 556
Localização: Pangolândia
Offline
|
Jose111 wrote:
2) Em aplicações JSE, se crie uma única conexão (durante a inicialização do programa, por exemplo), que será fechada no encerramento do programa.
Em aplicações JSE também é recomendado usar pool de conexões, já que em determinados momento uma unica conexão não será suficiente e o tempo gasto para criar novas conexões é muito grande assim atrapalhando na perfomace da aplicação.
Acredito que em aplicações desktop situações do tipo que você descreveu são mais raras, mas ainda, é uma solução válida.
|
programmer.setFucked(user.isStupid());
Sun Certified Java Programmer 1.4 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/04/2011 11:10:12
|
InicianteJavaHenrique
GUJ Ranger
![[Avatar]](/images/avatar/6689263e6df1fbd89377d1dac02f87b0.png)
Membro desde: 16/02/2011 12:20:00
Mensagens: 784
Localização: São Vicente - SP
Offline
|
This message was edited 1 time. Last update was at 15/04/2011 11:21:20
|
Jogo de Xadrez com I.A feito em Java 2D. - HFS Softwares
"Felizes os Tópicos que estavam aqui neste dia: 07/12/2008, neste horário: 22:11:56 e neste local." - Henrique Ferreira da Silva
"O negócio de software é binário, você é 1 ou 0, vivo ou morto." - Filme Ameaça Virtual
"Existem 10 tipos de pessoas no mundo: as que entendem binário e as que não entendem."
"Compartilhar conhecimentos é uma forma de alcançar a imortalidade." - Dalai Lama
"Aquele que pergunta é um tolo por cinco minutos, mas aquele que não pergunta permanece um tolo para sempre." - Provérbio Chinês
"O topo da inteligência é alcançar a humildade." - Textos Judaicos
"Os computadores são incrivelmente rápidos, precisos e burros; Os homens são incrivelmente lentos, imprecisos e brilhantes; Juntos, seus poderes ultrapassam os limites da imaginação." - Albert Einstein
/**
*
* Programador Java
* @author Henrique Ferreira da Silva
* @since Julho/2010
*
*/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/04/2011 11:15:30
|
InicianteJavaHenrique
GUJ Ranger
![[Avatar]](/images/avatar/6689263e6df1fbd89377d1dac02f87b0.png)
Membro desde: 16/02/2011 12:20:00
Mensagens: 784
Localização: São Vicente - SP
Offline
|
Obrigado pango e a todos pela dica, não tinha pensando em colocar try-catch dentro do finally, pois achava que em um único try-catch tratava-se todas as excessões. Obrigado pela dica consegui fazer com o seu exemplo.
Só não sei o que é pool (piscina ). Eu programa somente em J2SE (não sei ainda sobre J2ME e J2EE ) enfim...
Eu fiz um método para conexão :
Assim toda vez que preciso fazer um executeQuery ou executeUpdate (que são muitas vezes) eu chamo o método conexaoBD(), este pool é algo semelhante a isto
Por enquanto obrigado pelas dicas.
|
Jogo de Xadrez com I.A feito em Java 2D. - HFS Softwares
"Felizes os Tópicos que estavam aqui neste dia: 07/12/2008, neste horário: 22:11:56 e neste local." - Henrique Ferreira da Silva
"O negócio de software é binário, você é 1 ou 0, vivo ou morto." - Filme Ameaça Virtual
"Existem 10 tipos de pessoas no mundo: as que entendem binário e as que não entendem."
"Compartilhar conhecimentos é uma forma de alcançar a imortalidade." - Dalai Lama
"Aquele que pergunta é um tolo por cinco minutos, mas aquele que não pergunta permanece um tolo para sempre." - Provérbio Chinês
"O topo da inteligência é alcançar a humildade." - Textos Judaicos
"Os computadores são incrivelmente rápidos, precisos e burros; Os homens são incrivelmente lentos, imprecisos e brilhantes; Juntos, seus poderes ultrapassam os limites da imaginação." - Albert Einstein
/**
*
* Programador Java
* @author Henrique Ferreira da Silva
* @since Julho/2010
*
*/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/04/2011 12:06:09
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
neno wrote:Se eu tenho um looping que roda um determinado numero de vezes, e toda vez que eu passe nesse looping eu instancio um objeto, o que acontece com o mesmo no proximo looping?
Resposta simplista: Seu objeto fica desreferenciado assim que chegar na última linha do while, pois a variável sai de escopo, portanto o garbage collector pode remove-lo, desalocando a memória ocupada por ele. Em seguida, o while reinicia e um novo objeto é criado. Aloca-se novamente memória e roda-se o contrutor sobre ela. Resposta detalhada: Todo objeto é criado na região de vida curta do garbage collector. Apenas objetos que sobrevivam a muito tempo de execução são movidos para a área de vida longa. Caso um objeto de vida curta seja excluído, não há liberação física de memória. Sua área fica disponível, para que um outro objeto de vida curta a habite. Como no seu código, um novo objeto de mesmo tamanho irá ser criado na sequência, essa mesma área será reaproveitada e, ao invés de reservar novamente memória, o garbage collector só irá rodar o construtor para limpar aquele endereço previamente reservado. Dessa forma, seu programa terá um custo de alocação e desalocação próximo de 0 para esse tipo de situação (afinal, efetivamente o java só fica usando a mesma área de memória, e não criando e recriando objetos). É por isso que um programa que tenha uma estrutura como essa, que cria e destrói um mesmo objeto num loop, tem uma excelente performance em java, e uma péssima performance em C++ (a menos, claro, que vc implemente sua própria política de alocação de memória). Vale lembrar que alocar e desalocar memória é um custo altíssimo, e por isso esse tipo de estratégia é tão eficiente. Os projetistas da Sun, ao pesquisar sobre o comportamento dos objetos, perceberam que era muitíssimo comum criações e destruições dessa forma (mais comum até do que a existência de objetos de vida longa), e isso motivou essa otimização no gc. A resposta simplista ainda é correta pois, conceitualmente, toda essa ginástica é apenas uma inteligente otimização. Na prática, para nós programadores mortais, o que o java parece estar fazendo é simplesmente alocar e reservar memória novamente. Mais informações: http://www.ibm.com/developerworks/java/library/j-jtp10283/ http://www.ibm.com/developerworks/java/library/j-jtp01274/index.html
This message was edited 2 times. Last update was at 15/04/2011 17:40:19
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/04/2011 15:42:32
|
fabiofalci
GUJ Master
![[Avatar]](/images/avatar/c359889a833e7612e0cff1dc69d272bc.png)
Membro desde: 11/04/2006 09:23:14
Mensagens: 1057
Localização: Porto Alegre - RS
Offline
|
Mais uma bela dica em Vini. Favoritado!
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/04/2011 17:42:50
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
Por este motivo, a instanciação de objetos dentro de loops é considerada má prática. Faça isto somente quando for absolutamente necessário.
Como expliquei, em Java, não há diferença entre fazer isso dentro ou fora do loop, graças a política de gerações do GC.
Por isso, em java, é considerado boa prática fazer dentro do loop, pois isso reduz o escopo da variável do objeto.
Mais uma bela dica em Vini. Favoritado!
Obrigado! Na verdade, vale muito a pena ler todos os artigos do Goetz. Afinal, ele é o pai da criança :
http://www.briangoetz.com/pubs.html
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
|
|