Essa é uma pergunta muito incômoda, e eu sinto que contribui para muitos se oporem ao Java, apesar da utilidade de uma linguagem.
O fato de você não poder confiar no "System.gc" para fazer qualquer coisa é incrivelmente assustador e pode facilmente invocar o "medo, incerteza, dúvida" no idioma.
Em muitos casos, é bom lidar com picos de memória que você causa de propósito antes que ocorra um evento importante, o que levaria os usuários a pensar que seu programa foi mal projetado / não respondeu.
Ter capacidade de controlar a coleta de lixo seria uma ótima ferramenta educacional, melhorando a compreensão das pessoas sobre como a coleta de lixo funciona e como fazer com que os programas explorem seu comportamento padrão e também um comportamento controlado.
Deixe-me revisar os argumentos deste tópico.
- É ineficiente:
Muitas vezes, o programa pode não estar fazendo nada e você sabe que não está fazendo nada por causa da maneira como foi projetado. Por exemplo, pode estar fazendo algum tipo de espera longa com uma grande caixa de mensagem de espera e, no final, também pode adicionar uma chamada para coletar lixo, porque o tempo de execução levará uma fração muito pequena do tempo do longa espera, mas evitará que o gc atue no meio de uma operação mais importante.
- É sempre uma prática ruim e indica código quebrado.
Eu discordo, não importa qual coletor de lixo você tenha. Seu trabalho é rastrear o lixo e limpá-lo.
Ao chamar o gc durante os períodos em que o uso é menos crítico, você reduz as chances de ele funcionar quando sua vida depende do código específico que está sendo executado, mas decide coletar lixo.
Claro, pode não se comportar da maneira que você deseja ou espera, mas quando você deseja chamá-lo, sabe que nada está acontecendo e o usuário está disposto a tolerar lentidão / tempo de inatividade. Se o System.gc funcionar, ótimo! Se não, pelo menos você tentou. Simplesmente não há desvantagens, a menos que o coletor de lixo tenha efeitos colaterais inerentes que fazem algo terrivelmente inesperado ao modo como um coletor de lixo deve se comportar se chamado manualmente, e isso por si só causa desconfiança.
- Não é um caso de uso comum:
É um caso de uso que não pode ser alcançado com segurança, mas pode ser se o sistema foi projetado dessa maneira. É como criar um semáforo e fazê-lo para que alguns / todos os botões dos semáforos não façam nada, faz você questionar por que o botão está lá para começar, o javascript não tem a função de coleta de lixo, portanto examiná-lo tanto por isso.
- A especificação diz que System.gc () é uma dica de que o GC deve ser executado e a VM está livre para ignorá-lo.
o que é uma "dica"? o que é "ignorar"? se um computador não pode simplesmente dar dicas ou ignorar algo, existem caminhos rígidos de comportamento que podem ser dinâmicos, guiados pela intenção do sistema. Uma resposta adequada incluiria o que o coletor de lixo está realmente fazendo, no nível da implementação, que faz com que ele não execute a coleta quando você o solicita. O recurso é simplesmente um nop? Existe algum tipo de condição que eu devo atender? Quais são essas condições?
Tal como está, o GC de Java geralmente parece um monstro em que você simplesmente não confia. Você não sabe quando vai chegar ou vai, não sabe o que vai fazer, como vai fazer. Eu posso imaginar alguns especialistas tendo uma idéia melhor de como a coleta de lixo funciona por instrução, mas a grande maioria simplesmente espera que "simplesmente funcione", e ter que confiar em um algoritmo de aparência opaca para fazer o trabalho é frustrante.
Há uma grande lacuna entre ler sobre algo ou aprender algo, e realmente ver a implementação, as diferenças entre os sistemas e poder brincar com ele sem precisar olhar o código-fonte. Isso cria confiança e sentimento de domínio / compreensão / controle.
Para resumir, há um problema inerente às respostas "esse recurso pode não fazer nada, e não entrarei em detalhes como saber quando ele faz alguma coisa e quando não faz e por que não faz ou fará, muitas vezes implicando que é simplesmente contra a filosofia tentar fazê-lo, mesmo que a intenção por trás disso seja razoável ".
Pode ser aceitável que o Java GC se comporte da maneira que faz, ou não, mas, para entendê-lo, é difícil seguir verdadeiramente em que direção seguir para obter uma visão abrangente do que você pode confiar no GC e não fazer, por isso é muito fácil simplesmente desconfiar da linguagem, porque o objetivo de uma linguagem é ter um comportamento controlado até uma extensão filosófica (é fácil para um programador, especialmente iniciantes, entrar em crise existencial devido a certos comportamentos de sistema / linguagem). são capazes de tolerar (e se você não puder, você não usará o idioma até precisar), e mais coisas que você não pode controlar por nenhuma razão conhecida pela qual você não pode controlá-lo é inerentemente prejudicial.