Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Mário Miranda

Liberar memória de programa

Recommended Posts

Boa tarde.

Tenho uma dúvida. Não sou programador JAVA mas me arrisquei a montar um programa que fica rodando constantemente, em um while infinito que executa a cada 2 segundos, em busca de um arquivo. Quando ele acha esse arquivo, ele lê o mesmo, pega seu contetúdo e joga pra impressora.

 

Porém eu notei que o consumo de memória vai subindo à medida que ele encontra o arquivo.

 

Tem como liberar o espaço da memória?

 

Obrigado desde já.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Bruno.

Obrigado por responder.

Eu dei uma lida nesse esquema que você passou.

Mas como eu não entendo muito, me tira uma dúvida por favor: Onde eu monto o esquema no codigo?

Vou postar o código:

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;

import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.DocFlavor.INPUT_STREAM;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.JobName;
import javax.print.attribute.standard.MediaSizeName;
import javax.print.attribute.standard.OrientationRequested;
import javax.swing.JOptionPane;


public class print {
	public static void main ( String args[]) throws InterruptedException{
		String teste= "null";
		Integer numero=1;
	    while(numero < 10){
	    	Thread.sleep(2000);
	    	//JOptionPane.showMessageDialog(null, numero, "Erro", JOptionPane.ERROR_MESSAGE);
	    	
	    
		try {       
			BufferedReader in = new BufferedReader(new FileReader("C:\\Documents and Settings\\argox.txt"));            
			String str="teste";      
			
			while (in.ready()) {               
				str = in.readLine();
				teste+=str+"\n";
				//JOptionPane.showMessageDialog(null, str, "Erro", JOptionPane.ERROR_MESSAGE);
				process(str);
				
			}            
			in.close();    
			} catch 
			(IOException e) 
			{    
				
			}
			
		// /n/r para novas linhas e /f para fim da pagina
		if(teste!="null"){
		try{
		InputStream prin = new ByteArrayInputStream(teste.getBytes()); 
		INPUT_STREAM docFlavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
		SimpleDoc documentoTexto = new SimpleDoc(prin, docFlavor, null); 
		PrintService impressora = PrintServiceLookup.lookupDefaultPrintService(); // pega a //impressora padrao
		PrintRequestAttributeSet printerAttributes = new HashPrintRequestAttributeSet();
		printerAttributes.add(new JobName("Impressao", null)); 
		printerAttributes.add(OrientationRequested.PORTRAIT); 
		printerAttributes.add(MediaSizeName.ISO_A4); // informa o tipo de folha
		DocPrintJob printJob = impressora.createPrintJob(); 
		File delDir = new File("C:\\Documents and Settings\\argox.txt");   
		delDir.delete();
	    //delFile1.createNewFile();  
		//JOptionPane.showMessageDialog(null, teste, "Erro", JOptionPane.ERROR_MESSAGE);
		teste="null";
		
		try{ 
		printJob.print(documentoTexto, (PrintRequestAttributeSet)printerAttributes); //tenta imprimir
		} 
		catch(PrintException e){
		JOptionPane.showMessageDialog(null, "Não foi possível realizar a impressão !!", "Erro", JOptionPane.ERROR_MESSAGE); // mostra //mensagem de erro
		} 
		prin.close();
		}
		catch(Exception e){
		}
		
		
		}
	    }

	}


	private static void process(String str) {
		// TODO Auto-generated method stub
		
	}
	
}


Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu não tive tempo pra ver o código, mas a chamada ao gc não é garantida pela especificação.

O que voce tem que fazer é limpar toda a referencia dos objetos que não vai mais usar e sugerir que o coletor rode.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O garbage collector (lixeiro) é uma thread que é executada pela máquina virtual de tempo em tempo. O que ela faz é remover do heap todos os objetos que não têm mais referência (objeto == null) e que não serão mais usados.

 

Como já disseram anteriormente, não há como saber quando o lixeiro passará e nem como mandar que ele colete o "lixo". Porém você pode sugerir que ele passe naquele momento.

// Chamar garbage collector
System.gc();

Exemplo:

public static void main(String[] args) {
   ... código
   String cumprimento = "Olá mundo!";
   System.out.println(cumprimento);

   // Remove a referência do objeto
   cumprimento = null;
   // Chama o garbage collector
   System.gc();

   // Objetos sem referência serão destruídos pelo lixeiro
   ... mais código
}

Agora se você reutilizar o objeto cumprimento, o lixeiro não o destruirá.

public static void main(String[] args) {
   ... código
   String cumprimento = "Olá mundo!";
   System.out.println(cumprimento);

   // Remove a referência do objeto
   cumprimento = null;
   // Chama o garbage collector
   System.gc();
   cumprimento = new String("Outra referência"); // Não será removido pelo lixeiro
   
   // Objetos sem referência serão destruídos pelo lixeiro
   ... mais código
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.