Olá!
Seria normal a JVM (automaticamente) chamar o garbage collector a cada 8 segundos?
Estou tentando otimizar um programa, mas eu acho esse intervalo muito pequeno.
O que acham?
Mas especificamente, o que levou a considerar modificação no trabalho da jvm ? e como faria isso? ainda estou estudando. Pelo pouco que sei, que é preciso tomar mais cuidado é com o tamanho da pilha da jvm, ela sim pode trazer pros, dependendo do caso.
o que você quer dizer?
Como chegou ao valor de 8 segundos? Por que acha pouco?
Quantos objetos está criando? Qual o tamanho deles? Que tipo de otimização está fazendo? Que tipo de problemas está tendo e que quer resolver com uma otimização do Garbage Collector?
Como o artigo citado acima explica, chamar o System.gc() não garante que a execução será imediata. Além disso, sua execução pode ser custosa dependendo de quantos objetos precisam ser liberados, piorando o desempenho. Então pode não ser uma boa ideia ficar chamando o GC seguidamente.
Faça um profiling para descobrir os gargalos. Indique o problema que está tentando resolver (muita memória? processamento alto? sistema lento) para sugerirmos soluções.
Abraço.
<img src="/uploads/default/original/3X/6/0/60e899c5f69a9ec075dc5565ca14417d00f187f7.PNG" width=“600” height=500">
Por exemplo, o funcionamento do gc para realizar o Generational Copying e quando o espaço da Yg estiver cheia, e ele só atua com objetos que iram se manter vivos. Tendo isso em vista, por qual motivo ele iria trabalhar, mesmo com você chamando.
Neste caso, diminuindo o espaço da Yg, você consegue força a ele fazer a copia e depois uma varredura. Em alguns gargalos isso se torna uma boa solução, imaginando que você tive-se objetos que dificilmente fossem varridos ou até diminuindo a quantidade de objetos que iram para Old, assim tornando mais fácil na hora de dar um Mark-and-Sweep. Mas são tipos de problemas específicos.
Usando o –verbose:gc, você poderá analisar o tipo de problema que você está tendo, se ele está dando muito FullGC, se tem muita carga no Old, e afins. identificando melhor o mesmo.
Como pode ser visto, ainda não assimilei isso muito bem. TT
Claro!
Mas confesso que não fui claro na minha pergunta.
O que quis dizer era se é normal a JVM ter que chamar a GC a cada 8 segundos.
Eu não estou chamando gc() explicitamente.
Extensão:
Usando o método freeMemory() da classe Runtime. Descobri que a JVM estava chamando o GC constantemente a cada 8 segundos.
E acho que esse intervalo muito pequeno, então imagino que o programa não está bem otimizado, embora
ele tenha excelente performance.
[quote=“harys, post:6, topic:348168”]
Mas confesso que não fui claro na minha pergunta. O que quis dizer era se é normal a JVM ter que chamar a GC a cada 8 segundos.[/quote]
Isso depende da aplicação que está rodando. O comportamento (frequência de execução) do garbage collector não é fixo, ele depende de cálculos internos da jvm. Se na sua aplicação está sendo de 8 em 8 segundos, é porque é esse o intervalo que a jvm computou ser adequado para a sua aplicação. O que não quer dizer que seja o mesmo intervalo para qualquer aplicação.
O que quer fazer exatamente? Que resultado espera obter? Por que acha que a otimização do seu programa é necessária? Por que acha que a otimização passa por mexer no gc?
Mais importante: como chegou à conclusão de que esses 8 segundos são um problema? Você acabou de dizer que o programa tem bom desempenho, por que otimizar mais (sendo que não está claro que há um problema)?
Abraço.
O programa não está completo, quando estiver, suponho que a JVM terá que chamar o GC a todo momento.
Por isso vejo esse intervalo CURTO como um problema
Isso me preocupa…
Mas muito obrigado!! Eu vou ver no que vai dar!
Se a demanda pelo gc aumentar, a jvm ajustará o tempo automaticamente. Não há motivo para você estar preocupado nesse momento.
Complete a aplicação, faça profiling e monitore o desempenho. Daí então, somente se precisar, você faz ajustes.
Abraço.