Aqui estão os fatos:
a linguagem Go tem um coletor de lixo.
Java tem uma coleta de lixo
muitos programas Java têm (sutis ou não) vazamentos de memória
Como exemplo de um programa Java que tem vazamentos de memória (não para os fracos de coração, a questão pode abalar suas crenças), veja aqui um pequeno programa Java chamado Tomcat que tem até um botão "encontrar vazamentos": Existe uma maneira evitar vazamentos de memória de desdobramento no Tomcat?
Portanto, estou me perguntando: os programas escritos em Go exibirão o mesmo tipo de vazamento de memória (sutil ou não) que alguns programas escritos em Java exibem?
java
memory-leaks
go
SintaxeT3rr0r
fonte
fonte
memory leak
é melhor do que a sua".Respostas:
Você está confundindo diferentes tipos de vazamentos de memória aqui.
Os horríveis vazamentos de memória baseados em gerenciamento de memória explícita acabaram em Java (ou em qualquer outra linguagem baseada em GC). Esses vazamentos são causados pela perda total do acesso aos blocos de memória sem marcá-los como não utilizados.
Os "vazamentos de memória" ainda presentes em Java e em todas as outras linguagens na face do planeta até que o computador possa ler nossas mentes ainda estão conosco, e estarão no futuro próximo. Esses vazamentos são causados pelo código / programador que mantém referências a objetos que tecnicamente não são mais necessários. Esses são bugs fundamentalmente lógicos e não podem ser evitados em nenhuma linguagem usando as tecnologias atuais.
fonte
java.util.logging.Level
que contém uma estática privadaArrayList
na qual todos os objetos que são construídos são colocados na construção e dos quais nunca são removidos), o que torna mais difícil evitá-los ao programar em Java do que em alguma outra linguagem que não contenha tais falhasÉ muito possível que os programas Go apresentem vazamentos de memória. A implementação atual do Go tem um coletor de lixo de marcação e varredura simples. Isso é apenas uma solução temporária e não um coletor de lixo de longo prazo. Veja esta página para mais informações. Olhe sob o cabeçalho
Go Garbage Collector
. Essa página ainda tem um link para o código da versão atual, se você quiser.fonte
Um 'vazamento de memória' ocorre quando um pedaço de memória que o programador pensava que seria liberado não é liberado. Isso pode acontecer em qualquer idioma, lixo coletado ou não. A causa comum em linguagens de GC é reter uma referência adicional à memória.
“As linguagens não causam vazamentos de memória, os programadores causam vazamentos de memória”.
fonte
Coleta de lixo ou não, você pode escrever um programa que tenha vazamentos de memória em Java, Go ou qualquer outra linguagem na maior parte.
A coleta de lixo tira parte do fardo do programador, mas não evita totalmente os vazamentos.
fonte
Você está misturando níveis de abstração aqui: os vazamentos de memória são devido a bugs na biblioteca (onde os objetos fazem referência uns aos outros embora cadeias de 'a contém referência a b', bem como uma compensação na implementação do coletor de lixo entre eficiência e precisão. Quanto tempo você deseja gastar para descobrir esses loops? Se você gastar o dobro, poderá detectar loops com o dobro do tempo.
Portanto, o problema de vazamento de memória não é específico da linguagem de programação, não há razão para que GO seja melhor ou pior que Java.
fonte