/ / Qual é a diferença entre o método System.gc () e finalize () em java? - java, coleta de lixo, finalize

Qual é a diferença entre o método System.gc () e finalize () em java? - java, coleta de lixo, finalizar

Estou confuso entre o sistema.gc () e finalize () do método java. Não podemos forçar a coleta de objetos de lixo para a JVM. Podemos escrever os dois métodos em nosso código java e, se os dois forem usados ​​para coleta de lixo, então o que vale em fornecer dois métodos para coleta de lixo por java?

Por favor, diga-me o trabalho exato de ambos os métodos e internamente como ele funciona?

Respostas:

11 para resposta № 1

System.gc() gentilmente pede ao sistema para fazer uma coleta de lixo. Javadoc diz:

Executa o coletor de lixo.

Você não pode controlar o quão "difícil" o lixocoletor irá funcionar. O funcionamento interno do coletor de lixo é específico da VM e é um tópico de pesquisa por si só. Mas geralmente há coleta de lixo "completa" e alguma coleta "incremental" menor acontecendo. Então considere System.gc como uma solicitação, mas não há garantia de que a coleta de lixo do seu objeto ocorra.

Object.finalize() pode ser substituído para especificar o que fazer quando um determinado objeto é coletado como lixo (na verdade, o que fazer antes de ser coletado). Javadoc diz:

Chamado pelo coletor de lixo em um objeto durante a coleta de lixo determina que não há mais referências ao objeto.

O uso clássico do finalizador é desalocar recursos do sistema quando um objeto é coletado como lixo, por exemplo liberar identificadores de arquivos, arquivos temporários etc.

Não use o finalizador para executar ações quando a JVM sair. Para esse fim, use um gancho de desligamento com o qual você se registra Runtime.getRuntime().addShutdownHook(Thread).


2 para resposta № 2

System.gc() força o coletor de lixo a funcionar, enquanto o Finalize() O método do seu objeto define o que o coletor de lixo deve fazer ao coletar esse objeto específico.

Grosso modo, é assim:

class MyClass {
public UnmanagedResource resource;

void Finalize() {
FreeUnmanagedResource(resource);
}
}

MyClass[] data = new MyClass[1000];
for(int i=0; i<1000; i++) {
data[i] = new MyClass();
}
//do some work
data = null;
System.gc(); //Note that it doesn"t guarantee you that all MyClass instances will be actually collected at this point.

1 para resposta № 3

system.gc() O método notifica a JVM que o coletor de lixo pode ser executado agora para limpar a memória excluindo objetos não utilizados. Conforme o documento java:

Chamar o método gc sugere que o JavaA Máquina Virtual se esforça para reciclar objetos não utilizados, a fim de disponibilizar a memória que eles ocupam atualmente para reutilização rápida. Quando o controle retorna da chamada do método, a Java Virtual Machine se esforça ao máximo para recuperar o espaço de todos os objetos descartados.

finalize() O método não acionará o coletor de lixo, mas será chamado enquanto o coletor de lixo destruir o objeto. Ele fornece as instruções para limpar o objeto corretamente.


1 para resposta № 4

o sistema.O método gc () garbage coleta os objetos criados pela nova palavra-chave, enquanto o método finalize () é usado quando queremos coletar os objetos que não foram criados usando a nova palavra-chave. Então, eu acho que isso e ans. seu Q


0 para a resposta № 5

Coleta de lixo é usado para recuperar a memória alocada do objeto e Finalize() é chamado pelo coletor de lixo antes de recuperar a memória Finalize() método usado principalmente para executar alguma operação antes de excluir o objeto


0 para a resposta № 6

Existem muitas classes que contêm ofinalize (), assumirei que você quer dizer o da classe Object. System.gc () é o que você chama quando deseja que o compilador de lixo do Java seja executado. Ele será executado sozinho a cada poucos minutos, mas você pode solicitar que ele vá quando quiser. Quando o coletor de gargabe é executado, ele chama o método finalize () em cada objeto que não tem mais referência. Basicamente, System.gc () limpa a memória e usa finalize () para se livrar dos objetos individuais.


0 para resposta № 7

As respostas aqui são ótimas, só queriaelabore um pequeno ponto sobre o método finalize (): você nunca deve usá-lo. Sua execução não é garantida e, eventualmente, o uso de finalize () adiciona uma penalidade de desempenho.

Conforme escrito em Effective Java por Joshua Bloch:

Os finalizadores são imprevisíveis, geralmente perigosos e geralmente desnecessário. nunca faça nada crítico em um finalizador. Nunca dependem de um finalizador para atualizar o estado persistente crítico.

E:

Ah, e mais uma coisa: existe uma penalidade de desempenho severa para usando finalizadores. Na minha máquina, o tempo para criar e destruir um objeto simples é de cerca de 5,6 ns. Adicionar um finalizador aumenta o tempo a 2.400 ns. Em outras palavras, é cerca de 430 vezes mais lento para criar e destrua objetos com finalizadores.

Prefira usar o seguinte recurso que encerra o padrão try-finally, com garantia de execução:

Bar bar = new Bar(...);
try {
// Your code here
} finally {
bar.releaseResource(); // You implementation. For example close connection
}

0 para a resposta № 8

O coletor de lixo é chamado chamando o System.gc() método em qualquer classe. Mas isso não garante que todos os anulado os objetos serão coletados como lixo antes que a jvm seja desligada. Então, basicamente gc() O método é coleta de lixo apenas os objetos criados usando a nova palavra-chave. Os objetos são criados por qualquer outra lógica que não seja a coleta de lixo chamando explicitamente finalize() método antes gc chama o coletor de lixo.