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

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);

[code]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);


}[/code]

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 ?

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.

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.