Pessoal!
Eu tenho uma aplicação de upload de arquivos, que consiste em um applet que se comunica com um servlet atraves das classes do HttpClient… eu faço o upload em pacotes (100), ou seja, para realizar um upload de um arquivo são realizados 100 posts ao servlet. O problema é que, a cada post, a memória do servidor (JBOSS 4.0.3SP1 - Tomcat 5) aumenta de acordo com o tamanho do conteúdo do post, e ao final do upload a memória não é desalocada… então se eu fizer alguns uploads grandes, logo a memória chega ao seu limite e eu tenho um outOfMemory exception…
o servidor não deveria desalocar essa memória? existe alguma maneira de eu desalocar na mão? no final do doPost do servlet eu coloquei um System.gc() mas não fez nenhuma diferença…
Obrigado!
Vitor Isaia
Não seria mais facil fazer esse upload normalmente? Pra que o Applet?
Com certeza sim. No sistema também tem o upload normal. A questão do applet é pq o upload deve possuir um acompanhamento (barra de status), deve calcular o hash do arquivo no inicio e comparar com o hash do arquivo final recebido no servidor, etc… enfim, existe uma série de requisitos (foi criado um protocolo para isso) que faz necessária a existência do applet…
Isso pode ser feito sem o Applet (com ajax por exemplo), mantendo o sistema “usavel” por qualquer um, mesmo que não tenha o JRE instalado…
Mas… dê uma olhada em como você está mantendo essas “partes” do arquivo no servidor, provavelmente está mantendo uma referencia para elas depois que o upload acaba…
[quote=“jairelton”]Isso pode ser feito sem o Applet (com ajax por exemplo), mantendo o sistema “usavel” por qualquer um, mesmo que não tenha o JRE instalado…
Mas… dê uma olhada em como você está mantendo essas “partes” do arquivo no servidor, provavelmente está mantendo uma referencia para elas depois que o upload acaba…[/quote]
Não há referências perdidas no servidor. Mesmo que eu não processe nada (deixar o método doPost em branco) a memória é acumulada. Basta que o POST seja realizado pra esse acúmulo ocorrer.
Estranho então, a principio eu não sei bem o que pode ser não…
Realmente é estranho. Já pesquisei muito, achei algumas pessoas com o mesmo problema que eu mas não encontrei nenhuma solução. Mas obrigado mesmo assim! :brinde:
Eu chamo este método 100 vezes, uma vez para cada pacote do arquivo.
Encoder.base64Encode(pack) retorna o conteúdo do pacote em String (base64). Na pior das hipóteses a memória do cliente é que deveria ser aumentada, não a do servidor…
private void sendPackage(byte[] pack) throws Exception
{
NameValuePair[] postData =
{
new NameValuePair(UploadConstant.OPERATION,
UploadConstant.PACKAGE_TRANSMISSION),
new NameValuePair(UploadConstant.TRANSID, this.transmissionID),
new NameValuePair(UploadConstant.DATA_PACK,
Encoder.base64Encode(pack))
};
this.postMethod = new PostMethod(this.host);
this.postMethod.setRequestBody(postData);
this.httpClient.executeMethod(this.postMethod);
this.postMethod.releaseConnection();
postData = null;
}