Os desenvolvedores java devem conhecer os algoritmos de coleta de lixo? [fechadas]

11

Recentemente, fui perguntado em uma entrevista se conheço algum algoritmo de coleta de lixo.

Eu sabia o que é coleta de lixo, mas nunca pensei em aprender sobre algoritmos de coleta de lixo, pois, como desenvolvedor, nunca tive que me preocupar com isso e o coletor de lixo faz todo o trabalho duro para mim.

Vocês acham que os desenvolvedores de Java devem conhecer os algoritmos do coletor de lixo? Se sim, você pode me dizer em quais devo procurar?

Nerd
fonte
1
Sim deveriam. Caso contrário, eles correm o risco de escrever um software que quebra sob carga pesada.
quant_dev 31/07/2012

Respostas:

9

Eu acho que conhecer algoritmos de coleta de lixo não é importante se você desenvolver "software padrão" e não plataformas de software. Você deve ter um entendimento básico de como um coletor de lixo funciona e é isso. A menos que você experimente atrasos críticos em seu software causados ​​pela coleta de lixo ou precise otimizar o uso da memória.

Se você está interessado nesses algoritmos, consulte este post: Quais são os algoritmos por trás do GC de baixa pausa?

Falcão
fonte
7

A coleta de lixo é um problema interessante e não trivial da ciência da computação.

Conhecer e entender um algoritmo para ele é uma indicação de que você tem um profundo interesse e compreensão desses algoritmos. Mesmo que você não tenha estudado o algoritmo GC do Java, me impressionaria se alguém pudesse fornecer uma descrição razoável de quais estruturas e algoritmos de dados seriam usados.

Em termos de programador Java, seria bom se um desenvolvedor pudesse descrever as vantagens e desvantagens do GC, o que incluiria um pouco de conhecimento sobre como ele é implementado. Isso indicaria ter interesse em saber como as ferramentas que você usa funcionam, em vez de apenas usá-las passivamente. Conhecer os custos também ajudaria você a programar de maneira a minimizar os custos.

Eu não diria que este é o "conhecimento necessário" para ganhar a vida como desenvolvedor Java, mas uma habilidade adicional que mostra que você é capaz e disposto a ir um pouco mais fundo do que o necessário para realizar o trabalho de hoje.

JohnMcG
fonte
2
Conhecendo um entendimento básico, eu concordaria (entender as coisas faz de você um codificador melhor). O problema é que, se você conhece os detalhes complexos e, em seguida, use that informationcria seu código. Isso pode causar problemas à medida que o GC é aprimorado e suas suposições sobre como o GC não são mais válidos e o código se torna não ideal (e, na pior das hipóteses, pode prejudicar o GC). É bom saber, mas você deve projetar seu código usando as práticas recomendadas, não com uma implementação específica em mente; os compiladores e o GC estão sempre melhorando e as otimizações de macro acabam falhando em ser úteis.
Martin York
Eu estava pensando mais do que isso: se você souber algo sobre como Stringé implementado, não concatenará em uma string usando +um loop.
31712 JohnMcG
4

Vejo duas razões pelas quais se deve saber como o coletor de lixo (ou qualquer algoritmo / tecnologia) funciona. Aqui estão elas:
1. Você obtém um melhor conhecimento do que está acontecendo abaixo do código que você escreve. Isso geralmente pode ajudá-lo a escrever um código mais eficiente, o que garantirá melhor desempenho. Em alguns casos, isso pode ser vital. (Tive uma experiência desagradável quando o GWT estava contando com o coletor de lixo do navegador e tivemos um grande vazamento de memória com o Chrome. Então tivemos que ver o que exatamente causou o vazamento.)
2. Esses algoritmos são sempre (ou quase sempre, não, sempre) confiável para desenvolvedores inteligentes, qualificados, qualificados e experientes. Portanto, estudar sua abordagem pode ser muito útil.

Vejo outra razão pela qual você fez essa pergunta na entrevista. Alguns desenvolvedores (especialmente meu ex-colega) acham que um desenvolvedor não é inteligente ou trabalha o suficiente, se não souber essas coisas. Não concordo com esta afirmação. De qualquer maneira, conhecer essas coisas é uma boa maneira de impressionar seu entrevistador.

superM
fonte
1
Eu concordo com (2) e metade de (1) (ajuda na depuração). Mas há perigos em (1) e projete seu código para funcionar com uma implementação específica de um GC, pois ele não será mais ideal quando o GC for aprimorado ou você passar para uma implementação com um tipo diferente de GC.
Martin York
@Loki Astari, você está certo quanto a ser perigoso para implementações específicas. Mas, por outro lado, há coisas que não mudam (por um longo tempo, pelo menos), por exemplo, os princípios de coleta de lixo do .NET.
SuperM
@superM: Na verdade, o GC da Mono é significativamente diferente do da Microsoft e está sendo substituído por outro completamente diferente.
Jörg W Mittag
@superM: Não me parece tão lenta a evolução do Java: en.wikipedia.org/wiki/Java_version_history (parece que uma vez por ano há um novo patch ou atualização). Com um novo lançamento no próximo ano. Agora isso não significa que o GC seja atualizado a cada vez, mas mostra o potencial para isso.
Martin York
@Loki Astari, está certo. Muito no desenvolvimento de software continua mudando rapidamente, e nosso trabalho é acompanhá-lo. Além disso, todas as mudanças são baseadas no que já existe, então eu não esperaria mudanças radicais em 1 ou 2 versões.
SuperM
4

Você deve conhecer a coleta de lixo geracional e os detalhes sobre a coleta de lixo Java (os espaços PermGen, Eden e Tenured). Você também deve estar familiarizado com a coleta de lixo em geral (como por que a contagem de referência geralmente é uma má idéia e por que marcar e varrer é melhor). Também recomendo a leitura de algumas implementações alternativas (como o GC "pauseless" na Zing JVM da Azul e o projeto Metronome em tempo real da IBM ).

TMN
fonte
3

Você deve ter ALGUM conhecimento sobre como a coleta de lixo para Java funciona por dois motivos:

Primeiro, se você não sabe como isso funciona, você pode tomar decisões de design acidentalmente que levam ao pior desempenho do seu aplicativo real. Isso se torna cada vez menos provável à medida que o GC melhora, mas se você tiver uma opção de algoritmos no seu aplicativo, conhecer algo sobre o GC significa que você pode escolher um com conhecimento do que ele fará, em vez de descobrir que isso causa mau comportamento.

Segundo, se você não sabe como funciona, não poderá ajustar o GC para um determinado aplicativo. A maioria dos programadores Java nunca precisa ajustar o GC, pois os parâmetros padrão funcionam bem o suficiente na maioria das vezes. Se você fizer algo que sai dessa "na maioria das vezes", poderá se ajustar aos parâmetros do GC. Fazer isso sem o conhecimento do GC é apenas girar aleatoriamente os botões - você pode obter algo útil com isso, mas é mais provável que você estrague tudo.

Portanto, embora eu não esperasse que um bom programador Java soubesse tudo sobre o GC, esperaria que esse programador soubesse em algum nível como o GC na JVM que eles estão usando funciona e quais são as vantagens e desvantagens disso Algoritmo GC.

Michael Kohne
fonte
1

Sim, todo desenvolvedor Java definitivamente deve saber o que está acontecendo nos bastidores da máquina virtual e isso inclui o trabalho da coleta de lixo.

O nível de conhecimento é outra questão. Eu não esperaria que um desenvolvedor normal explicasse a diferença de uma implementação real (eu mesmo teria que fazer algumas pesquisas), no entanto, o princípio básico do que um GC faz e quais os prós e contras contra o gerenciamento da memória deve ser Claro.

perdian
fonte