Dúvida performace, memória  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
neno
Debugger
[Avatar]

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!!
[Email] [MSN]
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
Adelar
GUJ Master
[Avatar]

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
[WWW] [MSN]
InicianteJavaHenrique
GUJ Ranger
[Avatar]

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
*
*/
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
Jose111
JavaGuru
[Avatar]

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
[MSN]
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
InicianteJavaHenrique
GUJ Ranger
[Avatar]

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
*
*/
InicianteJavaHenrique
GUJ Ranger
[Avatar]

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
*
*/
ViniGodoy
Moderador
[Avatar]

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
[WWW]
fabiofalci
GUJ Master
[Avatar]

Membro desde: 11/04/2006 09:23:14
Mensagens: 1057
Localização: Porto Alegre - RS
Offline

Mais uma bela dica em Vini. Favoritado!
[WWW] [MSN] [ICQ]
ViniGodoy
Moderador
[Avatar]

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
[WWW]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team