Java - problema de estrutura ou memoria

4 respostas
J

boa noite.
Desenvolvi um programa em java e estou a ter problemas a nivel da memória. o programa é o seguinte:

class Program{

JPanel panel = new JPanel();

public list(){



while (condition){

JLabel label = new JLabel(name);

JButton button = new JButton(Button);

button.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

detail(cod);

}});

panel.add(button,borderLayout.west);

panel.add(label,borderLayout.center);

}

}

public detail(int cod){



panel.removeAll();

JButton button = new JButton(Go Back);

button.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

list();

}});

panel.add(button);

}}

Agora sempre que clico no botao “go Back” a memoria do processo javaw aumenta e se eu fizer isso mtas vezes o programa rebenta.

Há alguma coisa que esteja mal ?

obrigado.

4 Respostas

W

percebi no seu codigo que tem alguns coisa que pode ser melhorada uma delas e a questão de criar muitos objetos dentro de um laço “for”.

por exemplo, seja isso:

for(int i=0 ; i< 100; i++){
     Object x1 = new QualquerCoisa();
     Object x2 = new QualquerCoisa();
     ...
}

então, ao invez disso dai, vc poderia fazer assim, que estaria economizando muita memoria:

Object x1 = null;
Object x2 = null;
for(int i=0 ; i< 100; i++){
     x1 = new QualquerCoisa();
     x2 = new QualquerCoisa();
     ...
}
R

seguinte, no actionPerformed do button vc chama o detail e no actionPerformed do goBack vc chama o list, o certo era no goBack vc retornar para o list, da forma que vc esta fazendo
esta causando uma recurcividade.
por isso toda vez que vc clica no goback a memoria aumenta, ao invez de retornar e liberar recurso vc esta e alocando mais.

E

Wonder, isso dá na mesma só iria economizar memória se a instância do objeto fosse reutilizada.

joscardoso, criar botões e outros controles é um pouco pesado e o que recomendo é não usar esse while para criar vários botões de uma só vez (só se realmente for necessário).

Luca
"joscardoso":
o programa é o seguinte:
jos, é a sua primeira mensagem aqui e vc não sabia. Mas quando a gente coloca código para a garela analisar, para manter nossa identação é preciso usar a marca de código. Em outras palavras: anteceder o código com
e no fim fechar o código com
tal como mostro abaixo: [list]
[code]
class Program{
 JPanel panel = new JPanel();
 public list(){
   ....
   while (condition){
     JLabel label = new JLabel("name");
     JButton button = new JButton("Button");
     button.addActionListener(new ActionListener() {  
           public void actionPerformed(ActionEvent e) {
                  detail(cod);
           }}); 
     panel.add(button,borderLayout.west);
     panel.add(label,borderLayout.center);
   }  
 }
 public detail(int cod){
    ....
    panel.removeAll();
    JButton button = new JButton("Go Back");
    button.addActionListener(new ActionListener() {  
           public void actionPerformed(ActionEvent e) {
                  list();
           }}); 
    panel.add(button);
  }}
[/code][/list] []s Luca
Criado 1 de setembro de 2004
Ultima resposta 2 de set. de 2004
Respostas 4
Participantes 5