[quote=entanglement]Que tal usar um outro algoritmo de garbage collection, e tunar os parâmetros?
Por exemplo, se você usava java -cp . SeuPrograma parametros, você faria algo como:
java -XX:+UseG1GC -cp . SeuPrograma
ou então
java -Xincgc -cp . SeuPrograma
ou então
java -XX:+UseParallelOldGC -cp . SeuPrograma
Veja qual é que funciona melhor para você.
[/quote]
Cara, tentei os 3, nenhum deu certo… Acho que meu problema não é a frequência com que o GC passa, e sim o monte de lixo que estou deixando na memória…
[quote=saoj ]Aumenta o heap com aquele parametro inicial do Java ou não cria tanto lixo. Reutilize os seus objetos.
Até daria para fazer o seu thread dormir enquanto a sua freeMemory() não aumenta, Ultimo caso tenta isso.
[/quote]
Eu aumentei o tamanho do heap com -Xms192m -Xmx1024m, dai, ele rodou mais tempo, mas deu o mesmo erro de estouro de heap… Tentei também a estratégia do Thread.sleep() e não deu certo…
[quote=rmendes08 ]Bom, na minha opinião, isso é caso para otimizar o algoritmo. Talvez você possa utilizar alguma abordagem divide-and-conquer, e processar os dados em partes.
[/quote]
Na verdade, é isso mesmo que estou fazendo… Estou implementando um sistema distribuído…
[quote=FernandoFranzini ]Vc tem 3 opções… Se seu processo ta gastando mais memoria do que a alocada para JVM…
[/quote]
Acho que estou mesmo é gastando referências de mais… Deixo o código abaixo… Quem puder da um força plz :oops:
[code]while ((linha = leitor.readLine()) != null) {
linha = linha.trim();
nrolinha++;
if (linha.startsWith(">")) {
pst = con.prepareStatement(“SELECT intCabecalho FROM tbCabecalho where strCabecalho = ?”);
pst.setString(1, linha);
rs = pst.executeQuery();
if (rs.next() == false) {
pst = con.prepareStatement(“INSERT INTO tbCabecalho (strCabecalho) values (?)”);
pst.setString(1, linha);
pst.executeUpdate();
pst = con.prepareStatement(“SELECT intCabecalho FROM tbCabecalho where strCabecalho = ?”);
pst.setString(1, linha);
rs = pst.executeQuery();
rs.next();
idCabecalho = rs.getInt(“intCabecalho”);
} else {
idCabecalho = rs.getInt(“intCabecalho”);
}
} else {
sequencia.append(linha);
leitor.mark(nrolinha);
proximalinha = leitor.readLine();
if (proximalinha == null || proximalinha.startsWith(">")) {
pst = con.prepareStatement("SELECT intSequencia FROM tbSequencia where strSequencia = ?");
pst.setString(1, sequencia.toString());
rs = pst.executeQuery();
if (rs.next() == false) {
pst = con.prepareStatement("INSERT INTO tbSequencia (strSequencia) values (?)");
pst.setString(1, sequencia.toString());
pst.executeUpdate();
pst = con.prepareStatement("SELECT intSequencia FROM tbSequencia where strSequencia = ?");
pst.setString(1, sequencia.toString());
rs = pst.executeQuery();
rs.next();
idSequencia = rs.getInt("intSequencia");
sequencia = new StringBuilder();
} else {
idSequencia = rs.getInt("intSequencia");
sequencia = new StringBuilder();
}
pst = con.prepareStatement("INSERT INTO tbCabecalhoFonteSequencia"
+ " values (?,?,?)");
pst.setInt(1, idCabecalho);
pst.setInt(2, idFonte);
pst.setInt(3, idSequencia);
pst.executeUpdate();
long tamanhoHeap = Runtime.getRuntime().totalMemory();
long tamanhoMaxHeap = Runtime.getRuntime().maxMemory();
long tamanhoLivreHeap = Runtime.getRuntime().freeMemory();
System.out.println("Tamanho Heap: " + tamanhoHeap);
System.out.println("Tamanho Máx Heap: " + tamanhoMaxHeap);
System.out.println("Tamanho Livre Heap: " + tamanhoLivreHeap);
}
leitor.reset();
}
}[/code]