• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

stein

Java heap space

7 mensagens neste tópico

Cumprimentos, eu tenho este metodo que me provoca o "java.lang.OutOfMemoryError: Java heap space" e ja experimentei aumentar a memoria disponível no projecto mas este acaba sempre por dar o mesmo erro, alguém tem alguma ideia de como optimizar o código de forma não "rebentar" a pilha?

public String readProperty() throws IOException {
            StringBuffer buffer = new StringBuffer();
            String line;

            try {

                while (true) {

                    line = readLine().trim();

                    if ((line.length() != 0) && (line.charAt(0) != '#')) {
                        if (line.endsWith("\\")) {
                            line = line.substring(0, line.length() - 1);
                            buffer.append(line);
                        } else {
                            buffer.append(line);
                            break;
                        }
                    }
                }

            } catch (NullPointerException e) {
                return null;
            }

            return buffer.toString();
        }



    }

thanks:)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso chega a parar? Não devias ter uma condição q verifica se encontrou EOF?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nos ficheiros mais pequenos não é necessario, nos maiores ele nao consegue chegar ao fim por falta de memoria :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Troca pela minha versão... embora dum ponto de vista lógico o teu ciclo tem as condições certas  :hmm:

troquei o StringBuffer por Builder, e não faço o line=line.substring...

já agora, põe um -Xmx grande mesmo, tipo -Xmx1024m

correr o código debaixo do profiler tb dava jeito. A SDK do Java 6 tem um chamado jvisualvm

public String readProperty() throws IOException {
   StringBuilder buffer = new StringBuilder(); //Builder pq não preciso de sincronização, i.e., pq é só uma thread a lhe mexer
   String line;

   boolean endsWithBackslash;
   boolean isComment;
   boolean emptyLine;

   line = readLine().trim();
   emptyLine = (line.length()==0);
   if(!emptyLine) {
         endsWithBackslash = line.endsWith("\\");
         isComment = line.charAt(0)=='#';
   }

   while(emptyLine || isComment || endsWithBackslash) {

         if(endsWithBackslash && !isComment && !emptyLine)
                buffer.append(line.substring(0,line.length()-1));

         line = readLine().trim();
         emptyLine = (line.length()==0);
         if(!emptyLine) {
             endsWithBackslash = line.endsWith("\\");
             isComment = line.charAt(0)=='#';
         }
   }

   buffer.append(line);

   return buffer.toString();
}
   

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

-Xmx1024m é capaz de ser um exagero...

Experimenta com valores mais baixos, começa em 128 e avança de 128 em 128...

Edit: não pude deixar de reparar que parece que estás a ler um ficheiro de settings, o Java já tem um objecto para ler e gravar de forma simples... Já agora, um ficheiro de settings que rebenta com a memória, cheira-me a esturro...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

Eu estou a tentar ler as propriedades dos ficheiros, mas ja percebi que rebenta em ficheiros grandes como imagens(iso), mas no projecto que estou a desenvolver não preciso de ler esse tipo de ficheiros:D

Mas se conhecerem alguma forma de não rebentar a aplicação enquanto estou a aberto a sugestoes:)

obrigado!!!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora