Problemas com Garbage Colector

3 respostas
B

Bom dia
Meu programa é para fazer o seguinte:

Tem 5 campos para serem preenchidos do tipo JTextField, ai tem 3 botoes Limpar, Salvar, e Listar.

Limpar limpa todos os campos JTextField.

Salvar salva as informações que tem em todos os JTextField's, incluive os que estão vazios, em variaveis pré definidas no inicio do programa, private String "a"... até "e".

E Listar por fim lista todos as informações salvas nessas variáveis globais de "a" até "e".

Gostaria de saber se colocando o GarbageColector no ActionListener dos botoes, o GarbageColector funcionará eficaciamente?

package garbageColector;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class Garb extends JFrame implements ActionListener {
	
	private JTextField campo1;
	private JTextField campo2;
	private JTextField campo3;
	private JTextField campo4;
	private JTextField campo5;
	
	private JButton listar;
	private JButton salvar;
	private JButton limpar;
	
	private String a;
	private String b;
	private String c;
	private String d;
	private String e;

	// metodo construtor do layout
	public Garb() {
	
		this.setTitle("Armazenamento de dados");
		
		BorderLayout telaFundo = new BorderLayout();
		Container container = new Container();
		container = this.getContentPane();
		container.setLayout(telaFundo);
		
		container.add(montaTelaSup(), BorderLayout.NORTH);
		container.add(montaTelaCentral(), BorderLayout.CENTER);
		container.add(montaTelaInf(), BorderLayout.SOUTH);
		
		
		this.setSize(800,600);
		this.setVisible(true);
	}
	
	/**
	 * Metodo para montar o painel superior
	 * @return
	 */
	public JPanel montaTelaSup(){
		JPanel painelSup = new JPanel();
		//painelSup.setBackground(Color.gray);
		
		FlowLayout sup = new FlowLayout();
		painelSup.setLayout(sup);
		
		
		
		//cria componentes do painel superior
		JLabel quest = new JLabel("Informe um numero a ser salva na memoria:");
		painelSup.add(quest);
		
		return painelSup;
	}
	
	/**
	 * metodo para criar o painel central
	 * @return
	 */
	
	public JPanel montaTelaCentral(){
		JPanel painelCentral = new JPanel();
		
		GridBagLayout central = new GridBagLayout();
		GridBagConstraints cont = new GridBagConstraints();
		painelCentral.setLayout(central);
		
		//cria os componentes do painel central
		
		JLabel text1 = new JLabel("Numero 1:");
		cont.gridx = 0;
		cont.gridy = 0;
		painelCentral.add(text1,cont);
		
		campo1 = new JTextField(10);
		cont.gridx = 1;
		cont.gridy = 0;
		painelCentral.add(campo1, cont);
		
		JLabel text2 = new JLabel("Numero 2:");
		cont.gridx = 0;
		cont.gridy = 1;
		painelCentral.add(text2, cont);
		
		campo2 = new JTextField(10);
		cont.gridx = 1;
		cont.gridy = 1;
		painelCentral.add(campo2, cont);
		
		JLabel text3 = new JLabel("Numero 3:");
		cont.gridx = 0;
		cont.gridy = 2;
		painelCentral.add(text3,cont);
		
		campo3 = new JTextField(10);
		cont.gridx = 1;
		cont.gridy = 2;
		painelCentral.add(campo3, cont);
		
		JLabel text4 = new JLabel("Numero 4:");
		cont.gridx = 0;
		cont.gridy = 3;
		painelCentral.add(text4,cont);
		
		campo4 = new JTextField(10);
		cont.gridx = 1;
		cont.gridy = 3;
		painelCentral.add(campo4, cont);
		
		JLabel text5 = new JLabel("Numero 5:");
		cont.gridx = 0;
		cont.gridy = 4;
		painelCentral.add(text5,cont);
		
		campo5 = new JTextField(10);
		cont.gridx = 1;
		cont.gridy = 4;
		painelCentral.add(campo5, cont);
		
	
		return painelCentral;
	}
	
	/**
	 * metodo para criar o painel inferior
	 * @return
	 */
	
	public JPanel montaTelaInf(){
		JPanel painelInferior = new JPanel();
		
		GridBagLayout inferior = new GridBagLayout();
		GridBagConstraints cont2 = new GridBagConstraints();
		painelInferior.setLayout(inferior);
		
		//cria os componentes do painel inferior
		
		listar = new JButton("Listar");
		cont2.gridx = 0;
		cont2.gridy = 0;
		listar.addActionListener(this);
		painelInferior.add(listar, cont2);
		
		salvar = new JButton("Salvar");
		cont2.gridx = 1;
		cont2.gridy = 0;
		salvar.addActionListener(this);
		painelInferior.add(salvar, cont2);
		
		limpar = new JButton("Limpar campos");
		cont2.gridx = 2;
		cont2.gridy = 0;
		limpar.addActionListener(this);
		painelInferior.add(limpar, cont2);
		
		return painelInferior;
		
	}

	public void actionPerformed(ActionEvent e) {
		if (e.getSource()==salvar){
			save();
			System.gc();
			
		}
		if (e.getSource()==listar){
			list();
			System.gc();
			
		}
		
		if (e.getSource()==limpar){
			clean();
			System.gc();
		}
		
	}
	
	public void save(){
		a = String.valueOf(campo1.getText());
		b = String.valueOf(campo2.getText());
		c = String.valueOf(campo3.getText());
		d = String.valueOf(campo4.getText());
		e = String.valueOf(campo5.getText());
		
	}
	
	public void list(){
		System.out.println(a);
		System.out.println(b);
		System.out.println(c);
		System.out.println(d);
		System.out.println(e);
	}
	
	public void clean(){
		campo1.setText("");
		campo2.setText("");
		campo3.setText("");
		campo4.setText("");
		campo5.setText("");
	}
	
	
}

3 Respostas

davidtiagoconceicao

Depende do que é “funcionar eficaciamente” para você.
Algumas considerações: a chamada explícita System.gc() não dá garantia de execução do collector. Ela apenas indica a solicitação de execução. Caso a JVM decida que há threads de maior prioridade, elas serão executadas antes do GC.
Não é necessário efetuar chamadas explícitas ao GC, a JVM irá efetuar chamadas de tempos em tempos ao mesmo e certamente irá executá-lo caso o sistema aproxime-se da falta de memória.
A chamada explícita ao GC também não é muito recomendade, exceto sob situações de grande necessidade, uma vez que isto pode comprometer negativamente a performance do seu sistema.
Mas, no seu caso, acredito que realmente o GC irá ser executado, mas acho que vale a pena avaliar a real necessidade de efetuar esta chama explícita.
Sugiro que você faça debugs do código com e sem as chamadas e verifique se há diferença significativa no consumo de memória.

B

david você diz verificar se da diferença na memoria dentro do proprio debug do compilador (no meu caso o eclipse)?

davidtiagoconceicao

Isso. Você pode fazê-lo verificando a memória alocada pelo processo no sistema operacional, mas acho que fazendo isso não vai ter muita precisão.

Criado 20 de novembro de 2008
Ultima resposta 20 de nov. de 2008
Respostas 3
Participantes 2