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?
Respostas:
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?
fonte
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.
fonte
use that information
cria 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.String
é implementado, não concatenará em uma string usando+
um loop.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.
fonte
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 ).
fonte
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.
fonte
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.
fonte