Java.lang.OutOfMemoryError: GC overhead limit exceeded

4 respostas
M

Pessoal,

Estou tentando transformar um arquivo em XML (O arquivo tem 500 MB) quando rodo da o seguinte erro:

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded at org.biojava.bio.seq.io.ChunkedSymbolListFactory.addSymbols(ChunkedSymbolListFactory.java:201) at org.biojava.bio.seq.io.SmartSequenceBuilder.addSymbols(SmartSequenceBuilder.java:90) at org.biojava.bio.seq.io.SequenceBuilderFilter.addSymbols(SequenceBuilderFilter.java:80) at org.biojava.bio.seq.io.CharacterTokenization$TPStreamParser.characters(CharacterTokenization.java:249) at org.biojava.bio.seq.io.FastaFormat.readSequenceData(FastaFormat.java:188) at org.biojava.bio.seq.io.FastaFormat.readSequence(FastaFormat.java:153) at org.biojava.bio.seq.io.StreamReader.nextSequence(StreamReader.java:105) at Main.main(Main.java:43) Java Result: 1

Meu código:

public class Main {

    public static void main(String[] args) {
        XStream xstream = new XStream();
        List valores = new ArrayList();
        BufferedReader br = null;
        try {
            String fileName = "arquivo4.txt";
            br = new BufferedReader(new FileReader(fileName));
            SequenceIterator stream = SeqIOTools.readFastaDNA(br);
            while(stream.hasNext()){
                try {
                    org.biojava.bio.seq.Sequence seq = stream.nextSequence();
                    //valores.add(seq);
                    DNA dna = new DNA();
                    dna.setNome(seq.getName());
                    dna.setSequencia(seq.seqString());
                    dna.setQualidade(seq.seqString());
                    valores.add(dna);
                    //System.out.println("Nome: " + seq.getName() + "\tURN: " + seq.seqString());
                } catch (NoSuchElementException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                } catch (BioException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                }
            }


        } catch (FileNotFoundException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                br.close();
            } catch (IOException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        String contatosEmXML = xstream.toXML(valores);
        System.out.println("\nContatos em XML:");
        System.out.println(contatosEmXML);
        
    }
}

Alguém tem alguma ideia ?

Obrigado,

Marcelo Gomes

4 Respostas

M

Eu mudei o código, e funcionou … coloquei para gravar a cada linha lida… mas queria saber em casos em que nao tem como fazer isso e que da esse problema como solucionar… por exemplo quando quero tratar uma imagem grande…

Obrigado,

Marcelo Gomes

A

Opa Marcelo, não tenho certeza, mas creio que se vc adicionar os argumentos -Xms256M -Xmx512M na hora em que vc executar sua aplicação (caso nao funcione, tente valores maiores) irá funcionar.

B

Tente usar streams de objetos: http://xstream.codehaus.org/objectstream.html

esqueleto

Tenta esse aqui.

-XX:-UseGCOverheadLimit

Funcionando ou não continua postando ai.

Criado 27 de maio de 2009
Ultima resposta 3 de ago. de 2010
Respostas 4
Participantes 4