Otimização na utilização da memória

Olá…Tenho uma aplicação cliente-servidor que tem como um dos objetivos facultar o tráfego de arquivos de vídeo de uma ponta à outra (acho que muitos de vocês já devem ter visto esse cabeçalho nas minhas questões aqui no guj, hehe)…Tenho uma thread no meu cliente que recebe os dados do vídeo e grava em um arquivo temporário. O protótipo de teste dela é o seguinte:

public void run()
    {
        try
        {
            Mensagem<String> requisicao = new Mensagem(TipoDeMensagem.REQUISICAO_ENVIO_DE_ARQUIVO_DE_VIDEO,nomeDoArquivo);
            saidaObjeto.writeObject( requisicao );
            saidaObjeto.flush();

            arquivo = controlador.getArquivoDeVideoTemporario(nomeDoArquivo);

            Mensagem<Integer> mensagem = (Mensagem<Integer>)entradaObjeto.readObject();

            if(mensagem.getTipoDeMensagem()==TipoDeMensagem.TRANSPORTE_DE_INFORMACAO_DE_TAMANHO_DE_ARQUIVO)
            {
                DataOutputStream saidaArquivo = new DataOutputStream(new FileOutputStream(arquivo));
                //O servidor envia o tamanho do arquivo que está para enviar, empacotado em um Integer
                int bytesParaReceber = ((Integer)mensagem.getDados()).intValue();
                
                this.painelRequisicao.iniciaTransmissaoArquivo(bytesParaReceber);
                
                int tamanhoDoFragmento = 102400;
                int bytesLidos;
                int totalBytesRecebidos = 0;

                //progressoTransmissao.inicia(bytesParaReceber, ThreadProgressoTransmissao.RECEBENDO_ARQUIVO);

                Mensagem respostaPadrao = new Mensagem(TipoDeMensagem.RESPOSTA_OK);
                
                while(bytesParaReceber>0)
                {
                    if(this.continuaTransmissao)
                    {
                        saidaObjeto.writeObject(respostaPadrao);
                        saidaObjeto.flush();
                    }
                    else
                    {
                        saidaObjeto.writeObject(new Mensagem(TipoDeMensagem.RESPOSTA_NAO_OK));
                        saidaObjeto.flush();
                        break;
                    }
                    
                    bytesLidos = (bytesParaReceber >= tamanhoDoFragmento ? tamanhoDoFragmento : bytesParaReceber);
                    System.out.println("Falta receber "+bytesParaReceber+" bytes");

                    Mensagem<byte[]> dados = (Mensagem<byte[]>)entradaObjeto.readObject();
                    saidaArquivo.write(dados.getDados(),0,bytesLidos);

                    bytesParaReceber = bytesParaReceber - bytesLidos;
                    totalBytesRecebidos = totalBytesRecebidos+bytesLidos;

                    this.painelRequisicao.setValorProgressoTransmissao(totalBytesRecebidos);
                    dados = null;
                }

                saidaArquivo.close();
                
                if(continuaTransmissao && bytesParaReceber==0)
                {
                    this.painelRequisicao.exibeVideo(arquivo);
                }
                else
                {
                    //significa que a transmissao foi abortada, assim o arquivo temporario é removido.
                    arquivo.delete();
                    arquivo = null;
                }
                
                this.painelRequisicao.finalizaTransmissaoArquivo();
                this.continuaTransmissao=false;
                this.terminouTransmissao = true;
            }
            else
            {
                arquivo.delete();
                arquivo = null;
                this.continuaTransmissao=false;
                this.terminouTransmissao = true;
                
                this.painelRequisicao.exibeErroTransmissao("Problemas no recebimento do arquivo.");
            }
        }
        catch(Exception ex)
        {
            arquivo.delete();
            arquivo = null;
            this.continuaTransmissao=false;
            this.terminouTransmissao = true;
            
            this.painelRequisicao.exibeErroTransmissao("Problemas no recebimento do arquivo.");
        }
    }

Quando eu recebo vários vídeos seguidos surge um OutOfMemoryError na instrução
Mensagem<byte[]> dados = (Mensagem<byte[]>)entradaObjeto.readObject();

Queria saber se meu modo de tratar esse problema é o mais correto ou se estou cometendo algum erro. Fora isso, há uma forma de otimizar a utilização da memória em termos de código (fazer um código que utilize melhor a memória)?

Puxa vida - um colega nosso foi despedido porque teve muitos problemas encapsulando um socket com um ObjectInputStream/ObjectOutputStream (basicamente vazamento de memória) e não soube resolvê-los a tempo. (Ele era teimoso pra burro também).
Dica: estude o método “reset” - basicamente você tem de chamar “reset” a cada vez que envia um objeto grande.

Cara…Usei o reset e tudo parou de funcionar, hehehe…Deixa eu dar uma olhada nisso…

Desculpe, eu estava resetando o fluxo quando recebia…Na verdade eu tinha que resetar o fluxo quando envio…
Não sei porque cargas d´agua fiz isso, hehehe…

Valeu pela ajuda cara…Vou dar uma olhada com mais calma em toda essa parte de IO…