Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.mysql.jdbc.PreparedStatement.<init>(PreparedStatement.java:437)
at com.mysql.jdbc.Connection.clientPrepareStatement(Connection.java:2185)
at com.mysql.jdbc.Connection.prepareStatement(Connection.java:4782)
at com.mysql.jdbc.Connection.prepareStatement(Connection.java:4687)
at importacoes.ImportaLigacoes.<init>(ImportaLigacoes.java:104)
at rhbmain.Main.main(Main.java:46)
Ref.: O porquê disso!?
18 Respostas
como assim o pq??? vc nao disse oq causou ué!!
Se for só a exception, traduza:
Space Out Of Memory
jopss 
OutOfMemoryError é algo que ocorre de forma imprevista e não há muito como tratar. Ocorre quando a JVM tenta instânciar um objeto qualquer e o sistema operacional diz que não dá. Aí, a JVM sai rodando o coletor de lixo e tenta de novo e o sistema operacional diz: não dá. A JVM tenta arrumar espaço, faz malabarismos para conseguir cada byte possível da memória. O sistema operacional diz: ainda não dá. Daí a JVM desiste, diz: “é… fudeu!” e lança um OutOfMemoryError.
EAE prsantos coloca o código ae.
Utilize um profiller para saber onde e quando está ocorrendo. O do Netbeans é muito bom!!! Tem um tbém no diretório bin do jdk, o jconsole.
KKKKKKKKKKKKKKKKKKKKKKKK
Estava almoçando, comendo, pois pobre não almoça, come!
KKKKKKKKKKKKKKKKKKKKKKKKKK
Mas vamos ao que interessa.
Estou lendo um txt e gravando.
Assim:
...
INSERT INTO Tb_Ligacoes ( DataHoraLigacao, TipoLigacao, Extensao, NumeroExtencao, Tronco, NumeroTronco, LigacaoRecebida, DDDTelefone, CodigoOperadora, NumeroTelefone, Toques, Duracao, Campo3, Campo4, Campo5) VALUES ('2005/02/03 10:12:00', 1, 'E', 1139 , 'T', 10120, null, null, null, 22553000, null, '19700101000019', null, null, null)
INSERT INTO Tb_Ligacoes ( DataHoraLigacao, TipoLigacao, Extensao, NumeroExtencao, Tronco, NumeroTronco, LigacaoRecebida, DDDTelefone, CodigoOperadora, NumeroTelefone, Toques, Duracao, Campo3, Campo4, Campo5) VALUES ('2005/02/03 10:12:00', 1, 'E', 1028 , 'T', 10901, null, null, null, 81891183, null, '19700101000029', null, null, null)
INSERT INTO Tb_Ligacoes ( DataHoraLigacao, TipoLigacao, Extensao, NumeroExtencao, Tronco, NumeroTronco, LigacaoRecebida, DDDTelefone, CodigoOperadora, NumeroTelefone, Toques, Duracao, Campo3, Campo4, Campo5) VALUES ('2005/02/03 10:12:00', 1, 'E', 1098 , 'T', 10109, null, null, null, 22030187, null, '19700101000030', null, null, null)
INSERT INTO Tb_Ligacoes ( DataHoraLigacao, TipoLigacao, Extensao, NumeroExtencao, Tronco, NumeroTronco, LigacaoRecebida, DDDTelefone, CodigoOperadora, NumeroTelefone, Toques, Duracao, Campo3, Campo4, Campo5) VALUES ('2005/02/03 10:12:00', 1, 'E', 1126 , 'T', 10118, null, null, null, 37739213, null, '19700101000110', null, null, null)
INSERT INTO Tb_Ligacoes ( DataHoraLigacao, TipoLigacao, Extensao, NumeroExtencao, Tronco, NumeroTronco, LigacaoRecebida, DDDTelefone, CodigoOperadora, NumeroTelefone, Toques, Duracao, Campo3, Campo4, Campo5) VALUES ('2005/02/03 10:12:00', 1, 'E', 1160 , 'T', 10117, null, 21, 22, 27622059, null, '19700101000031', null, null, null)
INSERT INTO Tb_Ligacoes ( DataHoraLigacao, TipoLigacao, Extensao, NumeroExtencao, Tronco, NumeroTronco, LigacaoRecebida, DDDTelefone, CodigoOperadora, NumeroTelefone, Toques, Duracao, Campo3, Campo4, Campo5) VALUES ('2005/02/03 10:12:00', 1, 'E', 1060 , 'T', 10105, null, null, null, 32712911, null, '19700101000035', null, null, null)
INSERT INTO Tb_Ligacoes ( DataHoraLigacao, TipoLigacao, Extensao, NumeroExtencao, Tronco, NumeroTronco, LigacaoRecebida, DDDTelefone, CodigoOperadora, NumeroTelefone, Toques, Duracao, Campo3, Campo4, Campo5) VALUES ('2005/02/03 10:12:00', 1, 'E', 1043 , 'T', 10102, null, null, null, 37612574, null, '19700101000128', null, null, null)
INSERT INTO Tb_Ligacoes ( DataHoraLigacao, TipoLigacao, Extensao, NumeroExtencao, Tronco, NumeroTronco, LigacaoRecebida, DDDTelefone, CodigoOperadora, NumeroTelefone, Toques, Duracao, Campo3, Campo4, Campo5) VALUES ('2005/02/03 10:12:00', 1, 'E', 1045 , 'T', 10928, '<I>3766 ', null, null, null, '001', '19700101000017', null, null, null)
INSERT INTO Tb_Ligacoes ( DataHoraLigacao, TipoLigacao, Extensao, NumeroExtencao, Tronco, NumeroTronco, LigacaoRecebida, DDDTelefone, CodigoOperadora, NumeroTelefone, Toques, Duracao, Campo3, Campo4, Campo5) VALUES ('2005/02/03 10:12:00', 1, 'E', 1099 , 'T', 10113, null, 21, 22, 26497661, null, '19700101000759', null, null, null)
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.mysql.jdbc.PreparedStatement.<init>(PreparedStatement.java:437)
at com.mysql.jdbc.Connection.clientPrepareStatement(Connection.java:2185)
at com.mysql.jdbc.Connection.prepareStatement(Connection.java:4782)
at com.mysql.jdbc.Connection.prepareStatement(Connection.java:4687)
at importacoes.ImportaLigacoes.<init>(ImportaLigacoes.java:104)
at rhbmain.Main.main(Main.java:46)
Quando tentou gravar o 1194, deu pau!
Mas acho que tem uma parada que se faz no IDE para aumentar a memória.
E que voltei a tentar desenvolver em JAVA depois de 8 meses, mas acho que é por aí.
Estou usando o ECLISE 3.2
Algo do tipo (não sei o que lá -MX512) algo assim.
Alguma coisa desse tipo -Xms256m -Xmx512m
Só não me lembro onde colocar isso no Eclipse
Isso é porque, sinceramente, você está estuprando a sua JVM. 
O que acontece é o seguinte. Você abre um PreparedStatement, e vai executando milhares de operações seguidas nele. Enquanto você não fechar o statement, ele vai manter essas operações abertas, para que ele possa dar o commit ou o rollback atomicamente (no caso de setAutoCommit(false)).
O problema, é que você joga mais e mais e mais operações no statement e ele vai processando e armazenando essas operações sem finalizá-las, devorando a memória da sua máquina.
Não é um prepared Statement porque os parametros estão no Log. <ERRO MEU TÁ NO STACK TRACE>
O problema certamente é que você está criando muitos objetos na memória.
Reveja o seu código, sobre coisas que estão ficando na memória em meio ao processo.
Concatenação de Strings tb não é legal, caso você esteja fazendo.
Se puder poste o código para podermos ajudar.
OutOfMemory aqui no GUJ é quase sempre por problemas de IO e grandes loops com esbanjo de memória.
O que o nosso amigo victorwss explicou ai em cima acontece mesmo mas pode ser resolvido da seguinte forma: crie um variável contadora, um int inicializado em 0. Defina um valor limite, por exemplo, 50.
Para cada operação que você jogar pra dentro do seu PreparedStatement, você incrementa seu contador. Quando esse contador chegar no valor limite, grave no banco, limpe o PreparedStatement, zere seu contador e recomece…
Outra coisa é ver como está sendo feita leitura do arquivo… Se estiver carregando tudo em memória ao invés de ler “aos pouquinhos” (com um BufferedReader da vida) e o arquivo for muito grande, também pode dar OutOfMemory
KKKKKKKKKKKKKKKKKKKKKKKKK
Como faço para Editar o Eclipse.Ini de dentro do próprio?
Irei colar o Código aqui.
KKKKKKKKKKKKKKKKKKKKKKKKKComo faço para Editar o Eclipse.Ini de dentro do próprio?
Irei colar o Código aqui.
Não vai mudar nada mexer no eclipse.ini
Ali tu vai aumentar a memória para o processo do eclipse.
Quanto tu executa um programa teu é em um novo processo.
para isso existem os parametros de execução dentro do botãozinho “Run” do eclipse.
Mas certamente vc nao precisa(e nem vai adiantar) aumentar a memória.
Tem é que tirar esse gargalo ai.
ACHO que estou fazendo merda mesmo!
Dê uma olha no meu PreparedStatement().
A cada passada cria um novo, quando deveria simplesmente alterar o conteúdo do método.
CERTO!?
//Lê arquivo de dados (.Txt)
try {
brContribuintes = new BufferedReader(new FileReader(strCaminhoArquivo + strNomeArquivo));
System.out.println("Apagando registros");
//Apaga registro antigos tabela
StringBuffer sbSQL = new StringBuffer()
.append("DELETE FROM tb_ligacoes");
ps = cnn.prepareStatement(sbSQL.toString());
ps.executeUpdate();
System.out.println("Registros apagados");
//Prenche tabela com novos registros
while ((strContribuinteRegistro = brContribuintes.readLine()) != null) {
//
if (strContribuinteRegistro.length() > 13) {
if (strContribuinteRegistro.substring(2, 3).equals("/") &&
strContribuinteRegistro.substring(5, 6).equals("/") &&
strContribuinteRegistro.substring(11, 12).equals(":") &&
(strContribuinteRegistro.indexOf('#') == -1 && strContribuinteRegistro.indexOf('*') == -1)) {
//Trata registro de ????????????/
ps = cnn.prepareStatement(trataContribuinte(strContribuinteRegistro));
ps.executeUpdate();
}
}
}
//Fecha arquivo texto
brContribuintes.close();
//Fecha
ps.close();
//Fecha conexão
cnn.close();
} catch (IOException errorIO) {
JOptionPane.showMessageDialog(null, errorIO.getMessage(), "Erro SQL", JOptionPane.ERROR_MESSAGE);
errorIO.printStackTrace();
} catch (SQLException errorSQL) {
JOptionPane.showMessageDialog(null, errorSQL.getMessage(), "Erro SQL", JOptionPane.ERROR_MESSAGE);
errorSQL.printStackTrace();
}
Também.
Pode além disso usar regex para validar a string ao invés desse monte de substring que cria várias strings na memória.
Tem outros problemas como:
Pra que esse StringBuffer ?
StringBuffer sbSQL = new StringBuffer()
.append("DELETE FROM tb_ligacoes");
O que que faz esse ?
trataContribuinte(strContribuinteRegistro)
Que é executado a cada vez no loop ?
Se monta o SQL ja ta errado.
Tu pode usar o mesmo sql e só mudar os parametros do PreparedStatement.
E por ultimo.
A leitura do arquivo ficaria melhor com NIO.
Até.
KKKKKKKKKKKKKKKKKKKKKKKKKK
PQP!
Concordo plenamente
Fiz isso e funcionou:
//Trata registro de ????????????
ps = cnn.prepareStatement(trataContribuinte(strContribuinteRegistro));
ps.executeUpdate();
ps.close();
Porém sei que não é a melhor forma.
Agora otimizarei segundo as idéias de vc´s.
A dos parâmetros é a correta.
Valeu!
o que é o tal do REGEX?