Fiquei sabendo por amigos e também li aqui na seção de Tutoriais do GUJ que existem a possibilidade de desabilitar o Garbage Collector explicitamente no código.
Preciso fazer isso pois tenho um programa que precisa medir tempos de execução de outros programas (curiosidade: em Pascal) para saber não estão otimizados.
Era possível desligar o GC até a versão 1.2 com a opcao -noasyncgc. Hoje em dia não há mais como…
Na verdade há uma maneira de “desligar” o GC que eu já utilizei com sucesso mas que dá bastante trabalho e apenas uma boa justificativa justica tal esforço: simplesmente não deixe nenhuma referencia sair de escopo. Cacheie tudo e faça um pool de objetos para tudo.
Pelo que entendi a sugestão é utilizar a técnica do Sérgio de nunca perder a referência para o Objeto, assim o GC nunca terá o que recolher.
Nunca vi um cenário desses, ou a necessidade de um, mas me cheira mal.
Para fazer medições de desempenho, normalmente você faz uma série de repetições dessa medição, e descarta os resultados mais lentos e mais rápidos. É como as notas de uma competição de ginástica olímpica.
Use alguma linguagem de script (como Python) se seu intuito é fazer medições simples de programas escritos em outra linguagem. Você pode desabilitar o garbage collector do Python e usar apenas “reference counting” caso desejado. http://docs.python.org/lib/module-gc.html
O que pode ser desabilitado em Java não é o garbage collector e sim o fato de System.gc provocar uma “garbage collection” requerida pelo usuário. Isso pode ser desabilitado (é uma “policy” em alguns web e application containers), para evitar que uma aplicação qualquer fique chamando explicitamente System.gc e “fritar” as outras aplicações.
[quote=luistiagos][quote]
Pelo que entendi a sugestão é utilizar a técnica do Sérgio de nunca perder a referência para o Objeto, assim o GC nunca terá o que recolher.
Nunca vi um cenário desses, ou a necessidade de um, mas me cheira mal.
[/quote]
Tbm nunca vi um cenario destes… e realmente não consigo imaginar o pq disto… a onde isto seria utilizavel… agora fiquei curioso… [/quote]
O GC é preemptivo, ou seja, ele precisa “parar o mundo todo” por alguns milisegundos para fazer o cleanup, mesmo em máquinas com mais de um processador.
Bancos de investimento e bolsas de valores são os principais interessados em “desligar” o GC, pois nesse business cada milegundo vale muito dinheiro. Mais sobre isso aqui:
Acho que poderia ficar mais viável desabilitar o Garbage Collector se no Java tivéssemos mecanismos para desalocarmos nossos Objetos do Heap de forma explícita e programática (algo parecido com destrutores…), ainda que isso pudesse levar a outros problemas.