Erro de memória

[b]Amigos,

Quando o código abaixo é executado, com muitos registros (131000) da erro de memória. Existe algum erro no código?
Alguem pode me ajudar?

Abração…

private void extracao(String dsExt, String dsTab, String dsAtribs){
	String dsSqlCarga = new String();
	String dsValores  = new String();
	String conCarga   = new String();
	int    nrCol, ttAtributo;
	ResultSet rs = null;		
	try {
		rs = conOperacional.selecionar(dsExt);
		ttAtributo = rs.getMetaData().getColumnCount();
		while (rs.next()) {				 
			nrCol = 1;
			dsValores = " ";								
			while (nrCol <= ttAtributo) {
				dsValores = dsValores + "'" + rs.getString(nrCol) + "'";
				if (nrCol < ttAtributo)
					dsValores = dsValores + ", ";
				nrCol ++;
			}
			dsSqlCarga = " insert into " + dsTab + " (" + dsAtribs + ") values (" + dsValores + ") ";
			carga(dsSqlCarga);
		}		
		
	} catch (Exception e) {   
		e.printStackTrace();
	}
	JOptionPane.showMessageDialog(null,	"Carga executada!",	"Informação", JOptionPane.INFORMATION_MESSAGE);
}

private void carga(String dsSql){		
	conDW.execultar( dsSql );		
}

Para facilitar a leitura.
Não é o caso, mas você deve fechar o ResultSet.

 private void extracao(String dsExt, String dsTab, String dsAtribs){
String dsSqlCarga = new String();
String dsValores = new String();
String conCarga = new String();
int nrCol, ttAtributo;
ResultSet rs = null;
try {
rs = conOperacional.selecionar(dsExt);
ttAtributo = rs.getMetaData().getColumnCount();
while (rs.next()) {
nrCol = 1;
dsValores = " ";
while (nrCol <= ttAtributo) {
dsValores = dsValores + "'" + rs.getString(nrCol) + "'";
if (nrCol < ttAtributo)
dsValores = dsValores + ", ";
nrCol ++;
}
dsSqlCarga = " insert into " + dsTab + " (" + dsAtribs + ") values (" + dsValores + ") ";
carga(dsSqlCarga);
}

} catch (Exception e) {
e.printStackTrace();
}
JOptionPane.showMessageDialog(null, "Carga executada!", "Informação", JOptionPane.INFORMATION_MESSAGE);
}

private void carga(String dsSql){
conDW.execultar( dsSql );
} 

Estava tendo o mesmo problema… resolvi aumentando a memoria alocada pra JVM… atraves do comando:

java -Xms512m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=256m -jar meu_programa.jar

Isso diz pra JVM alocar no minimo 512 megas na memoria e no máximo 1 giga…
Vc pode mudar esses parametros de acordo com sua necessidade…

Embora isto não faça absolutamente nenhuma diferença em termos de memória (não vai ser isso que vai lhe aliviar o problema), Java != VB, e não é aconselhável fazer isto que você fez:

 String dsSqlCarga = new String();
String dsValores = new String();
String conCarga = new String(); 

O correto é usar isto:

 String dsSqlCarga = "";
String dsValores = "";
String conCarga = ""; 

Não conheço casos em que seja necessário usar “new String()” para criar uma string vazia.

Outra sugestão é usar StringBuffer na variável dsSqlCarga.
Os comandos SQL (inserts no seu caso) são concatenados e , terminada a carga, um lote de processamentos (batch) é executado de uma vez só. Mas isso vai depender da sua implementação no banco.

Valeu moçada… brigadao mesmo