Java.lang.OutOfMemoryError

11 respostas
A

Galera … Olha o erro que deu hoje no servidor de um cliente. :cry:

2004-04-27 14:47:37 StandardWrapperValve[jsp]: Servlet.service() for servlet jsp threw exception
java.lang.OutOfMemoryError

Alguém saberia me dizer o que pode ocasionar esse erro ??? :roll:

Vale dizer que a Maquina é um CELERON 2.2 128 de ram e 40 de HD.

Valew … :smiley:

Obrigado …

11 Respostas

Ironlynx

Tem certeza que todos os recursos na sua servlet estão sendo fechados qdo necessário?Não há alguns objetos sendo criados involuntariamente?Sua heap memory,está lotada(sendo requisitada mais do q eh capaz) qdo acontece esse erro!(muitos objetos ou recursos abertos/sendo utilizados talvez…)

smota

resumindo. Voê está usando muita memória!!! (mais do que o definido para o heap da VM).

Você tem duas opções:

  1. Usar menos memória (nem sempre é possível, se você estiver gerando gráficos ou relatórios por exemplo);
  2. Aumentar o heap através das opções da JVM
    -Xms<size> set initial Java heap size
    -Xmx<size> set maximum Java heap size
A

Ironlynx, :smiley:

Com relação a objetos sendo criados involuntariamente, isso não acontece.
Agora me surgiu uma dúvida:
Toda vez que eu instanciar um objeto eu devo matá-lo ??? Como ??? :?:

smota, :smiley:

Esse heap do VM, o que é ?? Posso pensar que é um parâmetro para a VM dizendo o quanto utilizar da memória ??? :?:
O valor do heap que vem padrão é baixo mesmo ?? Ou uma estrutura ruim de um site pode comprometer esse heap ?? :?:
Mais uma dúvida smota,
-Xms<size> set initial Java heap size
-Xmx<size> set maximum Java heap size

São comandos ?? eu executo onde ?

Galera, Obrigadão mesmo.

Acho que vale dizer o seguinte …

Estou fazendo o todo o site sem a utilizaçào de Struts. Pois ainda estou estudando todo o conceito de mvc e struts, para que quando eu tiver segunraça utiliza-lo.

Será que se eu remodelar todo o site sob o conceito de Struts, esse problema fica mais dificil de acontecer ???

Obrigado pela força … 8)

smota

Hummm … quando vc diz que está fazendo “sem o struts” significa que você está escrevendo o controller da sua aplicação?
Não tá gerando nenhum graficozinho nem planilhas excel nem nada? Entonces corre, corre muito pq seu código tá pra lá de bagdá … use um profiler pra fazer um tunning nele pq só o controler zuando sua memória é sério.

O heap é relativamente baixo (louds, urubatan … o padrão é?), dá pra maioria das operações mas como eu disse algumas operações exigem mais memória.

Os parâmetros que eu mandei são passados para a JVM … se você estiver usando o tomcat será quando for chamá-lo … nos docs do tomcat acho que explica um jeitinho elegante de fazer isso, dê um procurar por lá.

_fs

O padrão é 64mb (retirado do site do HSQLDB :smiley: )

E andrejs, creio que o Ironlynx esta se referindo a objetos que gastam bastante recursos, mesmo quando não utilizados. Exemplo desses são Conexões a bancos de dados, Readers em geral etc.
Na dúvida cheque se o objeto possui algum método close() :smiley:

A

smota, :smiley:

Realemtene não esta sendo gerado nenhum gráfico nem planilhas, mas quando eu disse que não utilizo o conceito de Struts (por ainda estar estudando sobre isso), é por que eu não tenho nenhum controler, o site esta estruturado em jsp interagindo com servlets e só, não tenho nenhum controlador para gerenciar tudo isso.

Me desculpe, mas quando disse para eu utilizar um profiler pra fazer um tunning e não entendi nadinha … hehehe …

E … sim sim … uso o TomCat … Vou verificar a documentação para ver como mudar o heap. :smiley:

LIPE,

é necessario eu matar todas as instancias de uma classe ??? ou seja, preciso ter um close() ou seilá, um destroy() para todas as classes ??
Se eu naum mata-las, elas ficam na memória ??? o Garba Collection ( hehehe, não me lemnro como que escreve o coletor de “lixo” ) não é responsável para limpar tudo isso ???

Galera, Obrigadúúúú … :smiley:

cv1

Nao eh necessario “matar” nenhuma classe, mas fechar conexoes com o banco de dados eh ESSENCIAL. Alias, fechar qualquer recurso (conexoes, arquivos, buffers, streams) que voce abrir eh essencial. Sempre, sempre, sempre.

A

Galera, eu acho que é minha classe de conexão que esta me zuando.

Bom, a situação é que estamos migrando uma aplicaçào que era em Delphi com Informix para web em java com PostGree, por isso preciso acessar dos bancos diferentes.

Entaum fiz uma classe de conexão que tem um Hashtable com dois “registros”, 1 deles contém o conn = DriverManager.getConnection(url, userName, password) que faz conexão com informix e um outro conn = DriverManager.getConnection(url, userName, password) que faz a conexão com o Postgree.
Esse HashTable é static, ou seja, essas duas conexões ficam lá fixas.
E um método getConnection(int id), que me tras a conexão do informix ou postgree. Entaum quando alguma classe que herde a conexào precisa utilizar a conexão, eu verifico se esta disponível , se não tiver eu faço um loop de 1 segundo cada passagem para ele esperar e pegar a conexão.

Pergunto ??? Será que dess forma fica pressa conexão no banco ???

hehehe , explicando assim, sem ver a classse, acho que fica impossivel de responder neh !! :smiley:

Mas mesmo assim, obrigado … me ajudaram pakas … :smiley:

A
… pressa é claro que pelo menos uma relaçào com o banco sempre vai existir, porém, o que eu quis dizer é que se quando eu der um

stmt = connection.getConnection(idConnection).createStatement();

rs = stmt.executeQuery("Select blá blá blá … ");

se essa Query fica pressa no banco ??? ou seila, se fica na memória ?? ou seila … ja me perdi … :lol:

cv1

O problema nao eh soh a conexao - verifique se vc esta fechando todos os statements e resultsets tambem.

A

cv,

Acho que o problema é esse mesmo, pois já me esqueci varias vezes de fecha-los … vou varrer todo o site atrás disso.

Afinal o Garbage Colection não faz milagres né !!!

Galera … Obrigado mesmo … :smiley:

Criado 27 de abril de 2004
Ultima resposta 28 de abr. de 2004
Respostas 11
Participantes 5