Ao abrir varios arquvos seguidos eu tenho este erro java.lang.OutOfMemoryError: Java heap space

2 respostas
renatoClementi
Galera é o seguinte: eu ja procorei pelo Guj outros tópicos que falavam desse assunto e até os encontrei, mas nenhum com o problema parecido e com solução esperada. Eu criei uma aplicação que abre arquivos pdf. O nome do arquivo e pagina onde foi encontrada o objeto da busca aparecem em um JTable e quando o usuario clica na linha desejada abre o arquivo numa JInteranlFrame utilizado uma api Acrobate para visualizar PDF . Bom, pra conseguir abrir o arquivo na pagina desejada eu tenho que destruir o pdfViwer que esta na JInternalFrame existente e reconstrui-lo e coloco ele denovo na JDeskTopPane, até ai tudo bem, ele funciona direito. O problema começa quando: vamos supor, tem varias entradas na JTable eu vou clicando e ele vai abrindo os pdf's na pagina desejada so que em um dado momento, depois de abrir varios pdf's ocorre um java.lang.OutOfMemoryError: Java heap space. O codigo onde o erro ocorre e este: e segundo o NetBeans o erro ocorre na linha 37, quando ele faco output.write(rb, 0, ch);
private void initComponents()
    {
        
        this.setTitle("Visualização de Arquivo PDF: "+this.nomeArquivo);

        this.setResizable(true);
        this.setLayout(new BorderLayout());

        try
        {

            pdfViewer = new Viewer();
            this.add(pdfViewer, BorderLayout.CENTER);

        }
        catch (Exception ex)
        {
            Logger.getLogger(ExibePDF.class.getName()).log(Level.SEVERE, null, ex);
        }
        InputStream input=null;
        try

        {

            input = new FileInputStream(this.file);
            if(input != null)
            {

                   ByteArrayOutputStream output = new ByteArrayOutputStream();
                   // set read buffer size

                   byte[] rb = new byte[1024];
                   int ch = 0;

                   while ((ch = input.read(rb)) != -1)
                   {
                       output.write(rb, 0, ch);
                   }

                   byte[] b = output.toByteArray();
                   input.close();
                   output.close();

                   ByteArrayInputStream bai= new ByteArrayInputStream(b);
                   this.pdfViewer.setDocumentInputStream(bai);
                   this.pdfViewer.renderPage(this.page -1);
                   bai.close();
               }
        }
        catch (Exception ex)
        {

        }

        try
        {

            this.pdfViewer.setProperty("Default_Page_Layout", "SinglePage");
            this.pdfViewer.setProperty("Default_Zoom_Type", "FitVisibleWidth");
            this.pdfViewer.setProperty("Default_Magnification", "100");
            this.pdfViewer.activate();
            this.pdfViewer.execMenuItem(ViewerCommand.FitWidth_K);


        } catch (Exception ex)
        {
            Logger.getLogger(ExibePDF.class.getName()).log(Level.SEVERE, null, ex);
        }

        this.setSize(this.largura, this.altura);
        this.setLocation(0, 0);
        this.setClosable(false);
        this.setIconifiable(false);
        this.setVisible(true);


    }

Bom eu fecho todas a variaveis que trabalham com streams mas continua dando o erro, alguem sabe como realmente liberar a memoria pra que o erro não ocorra ?

2 Respostas

thorian-maskier

Oi amigo, isso ocorre porque excedeu o máximo de memória da sua JVM, uma coisa que tu pode fazer é ir na configuração de seu servidor de aplicação e aumentar o máximo de memória da sua JVM.

Vá em “Arguments > JVM arguments” dentro das configurações do servidor de aplicação e ins

-XX:PermSize=128m -XX:MaxPermSize=256m -Xms512M -Xmx1024M

Basta setar para os valores que deseja e pronto.

renatoClementi

Sim, eu entendo o por que do erro ocorrer, e inclusive ja tinha pensado na possibilidade de aumentar a memoria da JVM, mas o que eu quero é saber se tem uma solução melhor, sem precisar mexer na configuração, por exemplo uma forma de realmente liberar a memoria após a leitura e carregamento do arquivo, e entao a memoria estaria livre para abrir outro arquivo. Pois ao que me parece, cada vez que eu abro um arquivo a memoria utilizada para ler o arquivo anterior não esta sendo liberada. De qualquer forma eu agradeço pela ajuda.

Criado 3 de março de 2011
Ultima resposta 3 de mar. de 2011
Respostas 2
Participantes 2