Andre Yitian puxa a espada - é novo em Go alocado no heap ou na pilha

Trabalhem juntos para criar e crescer juntos! Este é o 30º dia da minha participação no "Nuggets Daily New Plan·August Update Challenge", clique para ver os detalhes do evento

Este artigo está incluído na minha coluna: "Vamos Golang Juntos"

Andre Yitian puxa a espada - é novo em Go alocado no heap ou na pilha

O que é análise de fuga?

Em C/C++, usamos malloc ou new para buscar um pedaço de memória do heap. Como usar essa memória depende inteiramente do programador, portanto, vazamentos de memória são propensos a ocorrer. A linguagem Go alocará memória para variáveis ​​em dois lugares. Embora Go também possa alocar memória para variáveis ​​através de new, a memória alocada pode estar no heap ou na pilha. Do ponto de vista do desempenho, a diferença de desempenho entre alocar memória na pilha e alocar memória no heap é muito grande. Portanto, se uma variável aloca memória no par ou aloca memória na pilha exige que o compilador chegue a uma conclusão por meio da análise de escape .

No princípio de compilação, o método de análise da faixa dinâmica de um ponteiro é chamado de análise de escape. Quando um ponteiro para um objeto é referenciado por vários métodos ou threads, dizemos que o ponteiro escapa.

ab654dcf5c4740bcccd8e77bba2c0e23_202208251401387.png

Qual é o significado da análise de fuga?

Na verdade, a análise de escape não é exclusiva do "mel" do Go, Java também usa a análise de escape.

Mas a análise de escape do Java tem muitas limitações, o Java não substituirá a alocação de heap pela alocação de pilha para objetos que não são escapados globalmente. No entanto, Java usa outro truque chamado substituição escalar , que evita a necessidade de colocar objetos na pilha. Essencialmente, ele decompõe o objeto e coloca seus membros base na pilha.

O GC da Go permite que os programadores escrevam negócios eficientes sem entender o heap e a pilha, e permitem que o compilador lide com o heap e a pilha...

Após usar a análise de escape, se o compilador descobrir que a variável não será chamada após o término da função, ele alocará a variável na pilha, afinal, usar a pilha é rápido e não causará fragmentação de memória. Se o compilador descobrir que uma variável é referenciada em outro lugar fora da função, ele aloca a variável na pilha.

Por que não alocar todas as variáveis ​​no espaço de heap? Não seria bom ser como C?

Isso ocorre porque o heap não pode ser limpo automaticamente assim que a função termina como a pilha, o que fará com que o GC funcione com frequência. Por meio da análise de escape, podemos alocar variáveis ​​para a pilha o máximo possível, o que pode reduzir a fragmentação da memória e reduza o tempo de reciclagem do GC, portanto, a análise de escape é um truque que o Go usa para reduzir a pressão do GC.

imagem.png

Como implementar a análise de fuga em Golang, quais são os métodos e operações?

A análise de escape de Golang é simplesmente que, se a referência de uma variável for retornada da função que a declara, ocorre "escape", pois ela pode ser usada por outro conteúdo fora da função, portanto, deve ser alocada no heap. Se a variável não for referenciada fora da função, a variável será colocada primeiro na pilha. No entanto, existem os seguintes casos especiais:

  • função chama outras funções
  • Referências como variáveis ​​de membro de estruturas
  • Corte e mapeamento
  • Ponteiro Cgo para variável

Há também uma situação, se a pilha estiver cheia ou não puder ser colocada, naturalmente ela só poderá ser colocada na pilha.

Referências

Imprensa da indústria mecânica "Coleção de teste escrito de entrevista com programador Go"

Go não precisa de GC estilo Java robberphex.com/go-does-not…

Explicação detalhada 2: Análise de escape do mecanismo de linguagem Go zhuanlan.zhihu.com/p/137536970

Análise de fuga de Golang www.jianshu.com/p/670ba8ed0…

Supongo que te gusta

Origin juejin.im/post/7135693533616275464
Recomendado
Clasificación