AWT-EventQueue-0" java.lang.OutOfMemoryError

3 respostas
I

Olá gente, sou iniciante em java e preciso de uma ajuda ou uma sugestão para solução.

Eu tenho um metodo que executa um select no banco de dados que tem por fim gerar um arquivo texto com os dados

obtidos nesse select, aproximadamente o tamanho desse arquivo será de 242,701 KB.
Esse metodo devolverá o resultado em uma StringBuffer e jogará em uma JTextArea.

Porém ao executar esse metodo tenho como retorno o seguinte erro:

Exception in thread AWT-EventQueue-0 java.lang.OutOfMemoryError: Java heap space

at java.util.Arrays.copyOf(Unknown Source)

at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source)

at java.lang.AbstractStringBuilder.append(Unknown Source)

Sei que é uma enorme quantidade de dados. Segue a parte do código:

Statement stmt = connection.createStatement();

String SQL = “”;				

SQL = select geralinha.DS_LINHA as linha \n

+from spc_geracao_linha geralinha, spc_geracao geracao \n

+where \n

+geralinha.id_geracao = geracao.id_geracao \n

+and geracao.dt_referencia = to_date (01/03/2012,dd/mm/yyyy) \n

+and geracao.nr_versao = 15’”;
ResultSet rs = stmt.executeQuery(SQL); 	   	 
     StringBuilder strBuffer = new StringBuilder();
while(rs.next())  
   {   	 
strBuffer.append(rs.getString("linha")).append("\n");
   } 
return  strBuffer.toString();
}

Não encontro solução, me perdoem por minha falta de conhecimento.

Sem mais, muito obrigado gente.

3 Respostas

gabrielfrios

Primeiro, coloque sei codigo dentro da tag [code] pra poder visualizar melhor. Quantos registros vc retorna do banco com esse select?

E

O tamanho do arquivo é de 241 MB, portanto uma string que contenha esses dados todos terá 2 x 241 MB = 482 MB; obviamente isso é mais memória que o Java reserva por padrão para um programa (que é por volta de 64MB).

Uma forma de quebrar esse galho é iniciar seu programa com a chave -Xmx para um valor maior que 500 MB; mas isso obviamente não é a melhor solução.

Se você realmente precisa apresentar tudo isso em uma JList (por exemplo), você pode usar uma JList “virtual”, que carregaria na memória apenas as linhas sendo apresentadas. Veja um esboço em

I

Obrigado por responder, aproximadamente 1469558 registros. Nunca terá menos que isso.
Vou postar o código do método responsável pela busca:

public String geracao() throws SQLException{

Statement stmt = connection.createStatement();

String SQL = “”;
SQL = "select geralinha.DS_LINHA as linha \n"
	 +"from spc_geracao_linha geralinha, spc_geracao geracao \n"
	 +"where \n"
	 +"geralinha.id_geracao = geracao.id_geracao \n"
	 +"and geracao.dt_referencia = to_date ('01/03/2012','dd/mm/yyyy') \n"
	 +"and geracao.nr_versao = '15'";
     ResultSet rs = stmt.executeQuery(SQL); 
     StringBuilder strBuffer = new StringBuilder();
while(rs.next())  
   { 
strBuffer.append(rs.getString("linha")).append("\n");
   } 
return  strBuffer.toString();
}

///////////////
E em uma outra classe de interface que irá receber a strBuffer.toString();

bGeracao = new JButton(Geracao);

bGeracao.addActionListener(

new ActionListener()

{

public void actionPerformed(ActionEvent e)

{

String data = dd/MM/yyyy;

String hora = h:mm;

String data1, hora1;

java.util.Date agora = new java.util.Date();;

SimpleDateFormat formata = new SimpleDateFormat(data);

data1 = formata.format(agora);

formata = new SimpleDateFormat(hora);

hora1 = formata.format(agora);

String tempo = "Iniciando Geração \n Data Início: “+data1+”  "+hora1+hs;

lDataAtual.setText(tempo);
String dataInicio = tDataInicio.getText();	 
						
						Object[] possibleValues = { "Sim", "Não"};
						Object selectedValue = JOptionPane.showInputDialog(null, 
				        		"Deseja realizar a Geração?",null,
				        JOptionPane.INFORMATION_MESSAGE, null,
				        possibleValues, possibleValues[0]);
						
						if(selectedValue == possibleValues[0]){
							
							if(dataInicio.equals("")){
								textoArea.setText("Data Inválida - Operação não realizada!");
							}else
								if(dataInicio != ""){
								textoArea.setText("Processando:");
							    String resultado ="";
								Contador cont = new Contador(lConta);  
								cont.start();
								iniciarActionPerformed(e);
								
								try {
							TabelaDAO dao = new TabelaDAO();
							resultado = dao.geracao();
							String aviso = "Geração Terminou";					   
			        
			                
							textoArea.setText(resultado);
							contador = false; 
							negrito=Font.BOLD;
								 	
								}catch (SQLException exe) {	
								// TODO Auto-generated catch block
								JOptionPane.showMessageDialog(null,exe.getMessage());
								exe.printStackTrace();	
								contador = false; 
								}//fim do catch              
					   	}
													
					   }else ///Fim If de validação de data
					   		if(selectedValue == possibleValues[1]){
					   			textoArea.setText("Ok,Operação não realizada");					   			
					   		}			
		                
					} // fim da classe 
	        });

Obrigado galera.

Criado 17 de maio de 2012
Ultima resposta 17 de mai. de 2012
Respostas 3
Participantes 3