Finalizando um objeto

Pessoal, consultei a API e não encontrei nenhum método que finalize explícitamente um objeto.Na classe java.lang.Object existe um método
finalize() que é chamado pelo coletor de lixo para finalizar objetos não mais referenciados.Porém uma chamada explícita a este método mesmo
tratando exceção referente a throwable, disparada por esse método,não resultou na finalização(desaparecimento) do objeto.
No meu caso eu quero finalizar uma janela mas a dica pode ser genérica,
ou seja, válida para a finalização de qualquer objeto.
Valeu!!!

Pelo jeito que o garbage collection funciona, nao tem como garantir quando ele vai limpar os objetos. Eh melhor nao depender disso pro seu codigo funcionar, ou vc acaba tendo problemas mais pra frente. O metodo finalize() nao deve ser chamado diretamente justamente por esse motivo (claro, se vc souber muito bem o que esta fazendo, existem excecoes, que ate hoje eu nao vi :)).

Pra finalizar com uma janela, ou qualquer objeto, eh soh ter certeza de que ele nao esta mais sendo referenciado em nenhum lugar, e deixe o GC cuidar do resto :wink:

O Garbage Collection vai eliminar seu objeto, mas não sabemos exatamente quando. Você pode atribuir null ao objeto, e ele estará elegível para a coleta, se nenhuma outra variável estiver fazendo referência ao objeto.

Márcio

Isso!!

Para fazer o que o cv falou, quando vc usar o objeto e terminar de usá-lo, faça isso:

meuObjeto = null; // está liberado para ser coletado pelo Garbage Colector

System.gc() // esse comando pede para a jvm tentar passar o garbage colector

Abraços!

É. Jamais poderemos saber exatamente quando um objeto será efetivamente eliminado da memória, podemos retirar a sua referência, e dizer para o java que tal objeto está pronto para ser liberado, mas quando ele será eliminado? Isso a GC é que escolhe!

Segundo o Ritter, isso SEMRPE funciona na JVM da Sun, mas o mesmo não necessariamente acotnece em outras.

Na boa, deixe o GC em paz, ele é bem eficiente, se puder perder um tempo para estudar os algoritmos disponíveis, tamanho de gerações, etc., ótimo, mas se você depender de otimização de GC para alguma coisa na sua aplicação, ou você está na plataforma errada (que tal C?) ou sua aplicação tem problemas estruturais muito grandes.

Bom para um objeto generico vc pode setar a referencia ao objeto para null, fazendo assim com que a posição da memoria aonde o objeto estava com as informações armazenadas não tenha mais referencia, podendo assim, fazer com que a garbage collector possa limpar a memoria pra vc, mas a GC funciona em uma thread de baixa prioridade entao como em threads se aparecer uma thread de maior prioridade ela entra na frente então não da pra saber quando a GC vai passar(mas com certeza ela vai passar quando tiver falta de memoria para não ter problema de vazamento) , mas ja que vc comentou sobre uma janela qual a sua intenção sobre liberar recursos dela?

Viu… tem um esquema para você manipular isso de maneira diferente em JAVA, caso seja necessário!

No java 2 tem a possibilidade de se usar gerenciamento avançado da coleta de lixo!

Para ser sincero, não se bulufas sobre o assunto, mas sei que tem e que tem a ver com as subclasses da classe (ou interface) Reference.

Se for essencial um gerenciamento avançado do seu espaço na memória, você poderá dar uma olhada neste assunto!

Abraços!
Thiago

Em minha aplicação estou tentando finalizar (fazer com que desapareça) uma janela de login do usuário logo após sua entrada na aplicação.Nesta aplicação parece óbvio que tal janela não fosse mais referenciada pois depois que entro no programa não mais a uso.Porém se clico n vezes
no botão de entrada da aplicação após a primeira entrada com sucesso(usuário e senha corretos) nesta janela de login, aparecerão n apicações.Parece pouco robusto não?Parece que é nesse sentido que tal janela ainda continua sendo referenciada, ou seja, posso gerar tantas aplicações possíveis até estourar a memória á partir de uma tela de login com usuário e senha corretos.Se for uma aplicação muito pesada essa possibilidade de estouro de memória parece um incoveniente para a execução do programa além da possibilidade de poluição visual gerada por várias aplicações estarem á vista simultâneamente sem nenhuma necessiade.Como faço para solucionar meu problema?

Você pode fechar a janela, após confirmado o login, mas creio que ainda assim a pessoa poderia clicar N vezes até a confirmação.
Você pode também transformar a classe de validação numa Thread, pra atender a multi-solicitações.

provavelmente o problema não está no Garbage Colector, e sim na arquitetura do seu sistema!

mas no pior dos casos,

desabilite o botão com o setEnabled e suma com a tela de login com o setVislbe

Gambiarra é comigo mesmo!
Se você quiser código com qualidade chama o Shoes!

Abraços!

Talvez vc não tenha um projetado bem o que vai fazer. Estourar a memoria é algo que não pode acontecer , dai ja ta errado.
Bom realmente vc tem que ver visualmente e funcionamente qual forma vc acharia melhor de fazer mas tem varias formas.

  • Nova Janela.
  • Thread.
    e varias outras dependendo da forma que vc queira implementar.

OBS: não entendi como o usuario pode clicar n vezes em sua janela de login se basta apenas uma vez para logar.

Eu entendi… isso é de certa forma uma inovação! E se chama reaproveitamento de Login e Senha!

Funciona de maneira similar a reaproveitamento de código.

Por exemplo, se você precisa abrir uma aplicação, para que colocar login e senha toda vez que quiser abrir a aplicação!

É só deixar a tela de login aberta o tempo inteiro, daí vc clica em logar e o sistema inicia! Viu só. Se o usuário usar com moderação, não estourará a memória, e ainda por cima irá ganhar produtividade!

A sim , agora entendi. Já vi algo parecido com o velox. Grato à explicação Thiago.

Perae.

Voltando ao assunto:

Se seu programa de login fica aberto … ele cria apenas uma instancia dele mesmo. Por que vazamento de memoria se ele não cria varias instancias dele. Como funciona a logica dele?

A lógica da minha classe que cria a tela de login é bem simples:
Ao clicar no botão para entrar na aplicação a implementação de ActionListener pela classe me permite a declaração e codificação
do actionperformed().Logo ao clicar no botão este método será
chamado e então se a entrada de senha e usuário forem válidos
será instanciado a aplicação, que corresponde ao objeto calculator.
Perceber que o método main() está nesta classe(Classe Privativa) e é nele que está a instância dela mesma.A classe que cria e valida o login
chama-se Privativa.Á seguir o código de tal classe:

code:

public class Privativa extends JFrame implements ActionListener
{
private JTextField txtUser;
private JLabel lblUser;
private JLabel lblSenha;
private JPasswordField pass;
private JButton btn,sair;
private final String strSenha = “123456”;
private final String strLogin = “user”;

public Privativa()
{
   super("Login do Usuario");
   
   Container cont = getContentPane();
   cont.setLayout(new GridLayout(3,2));
   cont.setBackground(Color.lightGray);
   
   lblUser = new JLabel("Usuario:");
   cont.add(lblUser);
   txtUser = new JTextField(10);
   cont.add(txtUser);
   lblSenha = new JLabel("Senha:");
   cont.add(lblSenha);
   pass = new JPasswordField();
   cont.add(pass);
   btn = new JButton("Entrar");
   btn.setBackground(Color.lightGray);
   cont.add(btn);
   btn.addActionListener(this);
   sair = new JButton("Sair");
   sair.setBackground(Color.lightGray);
   cont.add(sair);
   sair.addActionListener(this);
   
   setSize(325,100);
   setVisible(true);
   setResizable(false);
}

public boolean validaEntrada(String s1,String s2)
{
    return (s1.equals(strLogin)) && (s2.equals(strSenha));    
}
 
public void actionPerformed(ActionEvent e)
{
    
    if(e.getSource() == btn)
    {
         if(validaEntrada(txtUser.getText(),new String(pass.getPassword())))
         {
              Calculator c = new Calculator();
              c.show();
                                
          }
         else
         {
            txtUser.setText("");
            pass.setText("");
            JOptionPane.showMessageDialog(null,"Usuário sem acesso\n e/ou senha incorreta!","Ocorreu(ram) erro(s)",JOptionPane.INFORMATION_MESSAGE);
         }
    }
    else 
    {
         System.exit(0);
    }

}

public static void main(String args[])
{
   Privativa pri = new Privativa();
   pri.show();
}

}
[color=darkblue][/color]

Bom… não olhei seu código com detalhes…
Nem sei se o que vou propor seria a melhor opção!

Você poderia iniciar a sua Frame (Aplicação Principal… não o Login). Daí, antes de iniciar a aplicação definitivamente ele chama o Login. Se o usuário acertar a senha ele inicia a aplicação, e o login fecha, ou se o usuário errar, vc da um System.exit(0);

Abraços!
Thiago

Essa tela precisa ficar aberta o tempo todo? se nao é so fazer ela finalizar e abrir junto com o aplicativo que vc esta usando este login para validar.
Tipo:
1- Se sua aplicação precisa validar com este aplicativo e a tela de login não precisar ficar aberta , faça abrir junto com os aplicativos que vc criar para usa-los e faça ela fechar por ela mesma.
ou
2- Se precisa ficar aberta talvez seja interessante criar uma classe que intermedie o serviço de criação e finalização. Se vc criar uma classe para ficar apenas como a janela aberta de login , vc pode criar uma outra que toda vez que solicitada , crie o serviço utilize e depois da validação destrua os recursos, mantendo a janela aberta.

Pessoal a “gambiarra” do Thiago Senna deu certo.Quando a validação correta do login acontece eu faço com que a tela de login desapareça com o método seVisible.Não é gambiarra não pois o meu problema como vários em computação é não determenístico e portanto possue várias formas de ser solucionado que vão desde a otimização do algoritmo(com uma sistemática revisão da aplicação de OOP possibilitando o aperfeiçoamento via este paradigma) até o uso de estruturas fornecidas pela linguagem que foram definidas pelo Thiago Senna como gambiarra.
Um abraço para todos e valeu a dica Thiago!