minhas informações de contato
Correspondência[email protected]
2024-07-11
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Autor: ofLJli
Link: https://juejin.cn/post/7003213289425633287?searchId=20240709085629749958B21D886D4E67D4
Fonte: Nuggets de Terras Raras
Os direitos autorais pertencem ao autor. Para reimpressão comercial, entre em contato com o autor para autorização. Para reimpressão não comercial, indique a fonte.
As principais estruturas da JVM são: pilha de máquina virtual, heap e área de método. O tamanho do quadro de pilha da pilha da máquina virtual foi determinado pelo compilador. Com o fim do método ou da tecnologia de thread, a memória da pilha da máquina virtual também é reciclada. A área de heap e método Java tem incertezas significativas. A alocação e a reciclagem dessa parte da memória são dinâmicas. O que preocupa o GC é como gerenciar essa parte da memória.
Este artigo se concentra nas três coisas a seguir que o GC precisa realizar:
De acordo com duas hipóteses geracionais:绝大多数的对象都是朝生夕死
,熬过越多次的GC回收的对象就越难回收
. A pilha é dividida em gerações: nova geração (Eden, From, To), geração antiga e reciclagem geracional também é realizada durante o GC.
GC menor : Reciclar objetos não utilizados na nova geração A característica da maioria dos objetos da nova geração é que eles vivem e morrem durante a noite. Os tempos de disparo são:
标记-复制算法
Recicle esta área (discutida mais tarde).GC principal : Recicle objetos não utilizados na geração antiga.uso geral标记-清除算法
ou标记-整理算法
Reciclar.
GC completo : Recicle objetos não utilizados na área de heap e método. A faixa de reciclagem do Full GC é relativamente grande e o longo tempo de execução pode causar atrasos, portanto, o número de Full GC deve ser reduzido tanto quanto possível. Os tempos de acionamento são aproximadamente os seguintes:
Espaço insuficiente na geração antiga é causado por objetos da nova geração que entram na geração antiga, objetos grandes que entram diretamente na geração antiga, etc. Se esses objetos não puderem ser armazenados no espaço máximo contínuo da geração antiga, uma reciclagem completa do GC será realizada .
Espaço insuficiente na área do método A área do método armazena principalmente informações de tipo e pools constantes. Também existe o risco de espaço insuficiente e a reciclagem completa do GC será realizada.
System.gc() é chamado explicitamente e será reciclado pelo Full GC.
Princípio: uso可达性分析算法
Tornar objetos indisponíveismarcae, em seguida, execute oClaro . Desvantagens: A eficiência da marcação é baixa quando há muitos objetos. Após limpar o objeto, ocorrerá fragmentação da memória e a memória será descontínua. Objetivo: Alguns colecionadores usarão este algoritmo na coleção da geração antiga
Princípio: Divida o espaço de memória em dois, metade é usada para armazenamento de objetos e a outra metade é livre.Se a área onde os objetos estão armazenados estiver cheia, use可达性分析算法
Mova objetos vivosmarcasair e entãocópia de Vá para outra área vazia e limpe todas as áreas anteriores em espaços vazios contínuos. Desvantagem: Se houver muitos objetos sobreviventes, será necessária uma grande quantidade de cópia e desenvolvimento de memória. O espaço de memória só pode usar metade das vantagens e desperdiçar recursos. Função: Este algoritmo de reciclagem é geralmente usado para objetos que vivem e morrem na nova geração. No entanto, o algoritmo de replicação foi otimizado na nova geração, mas este algoritmo adiciona um mecanismo de garantia de alocação para evitar que muitos objetos sobreviventes sejam alocados. Um algoritmo de reciclagem estilo Appel é usado:
Princípio: O processo de marcação segue标记-清除算法
Igual, então整理存
Os objetos vivos se movem para uma extremidade e, em seguida, todos os objetos fora do limite vivo清除
. Desvantagens: Mover objetos envolve algum risco. Muitos objetos são ineficientes. Função: Principalmente na velhice.
O coletor de lixo utilizado pelo GC é utilizado para reciclagem. Com o desenvolvimento contínuo, existem cada vez mais coletores de lixo. Aqui estão os coletores de lixo convencionais e eles são divididos em três categorias: coletor de thread único, coletor de thread único e coletor de lixo simultâneo. dispositivo de coleta.
As combinações de coletores single-threaded são: Serial/Serial Coletor antigo. Eles não apenas usam um encadeamento de coleta para concluir a operação de coleta, mas enquanto o encadeamento de coleta está funcionando, o encadeamento do usuário deve parar de esperar até que a coleta seja concluída. A imagem mostra o diagrama esquemático do coletor Serial/Serial Old:
Se os recursos de memória do cliente forem limitados, o número de núcleos do processador for pequeno ou se for um processador de núcleo único, sua simplicidade e eficiência podem fazer com que o coletor conclua seu trabalho o mais rápido possível.
Os coletores multithread incluem: ParNew, Parallel Scavenge e Parallel Old, entre os quais Parallel Scavenge/Parallel Old é um coletor combinado. Esses coletores multithread adicionam apenas threads de coleta de lixo, e os threads do usuário ainda param de esperar pela coleta de lixo.
Coletor parNew: na verdade, é uma versão multithread do Serial. Atualmente, pode cooperar com o coletor Serial e o coletor CMS.
Coletor Parallel Scavenge: Geralmente usado em conjunto com o coletor Parallel Old.Comparado com o coletor parNew, ele presta mais atenção a吞吐量
controle, o rendimento éO tempo de execução do thread do usuário é responsável pelo tempo total de execução da CPU, o rendimento é obviamente quanto maior, melhor.
O multithreading geralmente utiliza o servidor, pois a execução do multithreading envolve o tempo de consumo da rotação do intervalo de tempo. Se for um único processador, a eficiência do processamento será sem dúvida mais lenta. Mas é muito bom para recursos, e o lado do servidor dos cálculos de análise que não precisa interagir com o usuário pode aumentar a eficiência de execução.
Os coletores simultâneos incluem: Coletor CMS, que é um coletor que visa manter o tempo de pausa do sistema o mais curto possível e proporcionar uma melhor experiência ao usuário. Seu thread de coleção pode ser executado simultaneamente com o thread do usuário. O CMS tem três标记
(marca inicial, marca concorrente, observação) e uma vez清理
(Limpeza simultânea), duas das três marcações exigem que o thread do usuário mais curto pare, uma marcação mais longa que seja simultânea ao thread do usuário e a limpeza que seja simultânea ao thread do usuário.
marca inicial: Marque o primeiro objeto associado ao GC Roots, o tempo é muito curto marcação simultânea: Executa a cadeia de referência do GC Roots (algoritmo de análise de acessibilidade) simultaneamente com o thread do usuário, o que leva muito tempo renomear : pesquise a nova cadeia de referência gerada pelo thread do usuário durante a fase de marcação simultânea. Um pouco mais que a marca inicial.Claro simultâneo:usar标记-清除算法
Limpe objetos inúteis.
Três desvantagens principais: 1: Sensibilidade da CPU, a simultaneidade pode afetar a operação dos threads do usuário em processadores com um pequeno número de núcleos. 2: Lixo flutuante: O lixo gerado durante a fase de limpeza simultânea só pode aguardar a próxima coleta de GC. Três: Fragmentação de memória, limpeza de marcação Os produtos Puja possuem uma grande quantidade de espaço de memória descontínua.
Este artigo começa com那些内存需要回收
,什么时候回收
,如何回收
Como implementação, são escritos dois algoritmos de julgamento de sobrevivência de objetos, condições para reciclagem de área de classe, mecanismo geracional e tempo de coleta de reciclagem, três algoritmos de coleta e coletores de lixo comumente usados.