1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

java.lang.OutOfMemoryError: Java heap space

Discussão em 'Programação' iniciada por SKIPTpaWa, 4 de Junho de 2009. (Respostas: 7; Visualizações: 1482)

  1. Bom dia pessoal, mais 1 dia, mais 1 duvida estúpida (se calhar) XD

    é o seguinte:

    Aqui no meio das minhas programações e tal em java, Estou a criar 1 programa que cria gráficos de gantt a partir de 1 tabela de encomendas e, quando são "milhoes" de linhas de gráfico de resultado, quando ta a criar o grafico, volta e meia, da o peido e aparece no systemOut:

    java.lang.OutOfMemoryError: Java heap space

    1º e unico ponto :P Dá para meter 1 try catch no "main" para este caso!? ou quando sao cenas de memoria nao ha hipotese para try catch?!



    (O que gera o grafico corre numa tread à parte para libertar os objectos swing)



    ***** bejinhos e respondam rapido :P []




    PS: Sei que dá para aumentar a memoria com o -Xmx , mas nao o queria fazer pois daqui a milhoes de anos vai haver milhoes de encomendas e puf na mesma.
     
  2. inginheiiro

    inginheiiro Power Member

    optimiza o teu codigo.
    liberta recursos de memoria que não estejam em uso e não esperes que o GC faça isso.
     
  3. Não dá para optimizar, porque quem cria as "linhas" do grafico é 1 api que estou a usar, ela sozinha faz isso.

    e tipo se forem umas 27mil e tal linhas como o caso, dà o "PUF!"

    mas se desse para fazer 1 cena ***** tipo um catch da " falta da memoria " ja alertava ***** coisa.

    porque o objectivo do programa é ter 1 filtro para seleccionar encomendas segundo certas caracteristicas.

    e se nao meter filtro nenhum aparecem todas....


    mas aparecerem todas... dá esse puf...

    ou se fizer 1 filtro que aparecao milhoes delas...

    da o PUF!


    se desse para fazer "catch" disso era milhoes de fixe, mandava para o ecra a dizer "filtre melhor" ou assim 1 cena.

    obrigado! :)
     
  4. inginheiiro

    inginheiiro Power Member

    não é aconselhavel tentar apanhar a excepção java.lang.OutOfMemoryError
    coloca aí o codigo para ver alguma possivel solução
     
  5. sounabo

    sounabo Power Member

    >>> 1º e unico ponto Dá para meter 1 try catch no "main" para este caso!? ou quando sao cenas de memoria nao ha hipotese para try catch?!

    Podes fazer (compila), mas não vai funcionar.
    Porque, se dá este erro, então é porque o garbage collector já não pode libertar mais nenhuma memória.
    Isso significa que, na próxima alocação de objecto, vais voltar a ter o mesmo erro.
     
  6. AliFromCairo

    AliFromCairo Power Member

    O GC faz isso. Este erro apenas é lançado quando o GC já não consegue reclamar mais recursos (depois de ser forçado a actuar), e quando a JVM não consegue obter mais memória devido a, por exemplo, ter atingido o limite que pode ser parametrizado com a flag Xmx.

    Sim, dá. Apesar de não ser uma excepção, estende a classe Throwable, logo é catchable. No entanto, não é aconselhável pelas razões que já foram indicadas.


    Podes sempre experimentar outra biblioteca para a criação dos gráficos, uma vez que o número de registos que mencionaste não é assim tão extraordinário como isso, o que pode indicar que algo não está a ser bem feito na geração dos gráficos.

    Também não creio que seja do interesse de alguém visualizar relatórios de encomendas com time spans de vários anos, logo, o que poderias fazer era colocar um filtro na aplicação que por omissão apenas utiliza as encomendas do presente mês ou outro critério que seja mais útil para o cliente ao qual se destina a aplicação.
     
  7. :)

    Obrigado a todos, como disse o AliFromCairo vou impor que o programa so mostre um certo limite de linhas. Porque apartir de um certo numero o que é vizualizado deixa de ser perceptivel. E, se limitar o numero, resolve-se o problema.



    Obrigado a todos! []


    ______________________________
    <-- My system spec's Rulz
     
  8. piaf

    piaf Power Member

    Aumenta tambem a memoria que o programa usa.

    Por omissao o valor é muito baixo.
    512Mb é um valor aceitavel e deve dar para muitos milhares de linhas
     

Partilhar esta Página