Tecnologia

Entendendo o gerenciamento de memória do Java

Por: , fevereiro 2, 2016

O Java gerencia a memória em duas grandes áreas: uma para objetos novos (younger generation, que é constituído do eden, survivor tosurvivor from) e outra para objetos antigos (old generation). Cada área tem um algoritmo diferente e limpeza e liberação de memória.

O Parallel Scavenge (PS Scavenge) é o algoritmo usado para as gerações mais novas de objetos do Java. Esse algoritmo ele faz uma varredura de todos objetos para ver se algum deixou de ser referenciado pelos objetos mais antigos e ativos e aqueles que não tem mais referencia são deixados para trás. Nessa varredura todos os objetos que são referenciados são copiados para outra área da memória e depois disso a área original é apagada, limpando os objetos sem referência e as cópias antigas dos objetos ativos. Existem três áreas gerenciadas por este algoritmo: o eden e duas áreas chamadas survivor (to e from). Basicamente os objetos todos são criados na área do eden e após um tempo é feito um GC parcial onde todos objetos referenciados são copiados para o survivor to. Após um tempo, no próximo GC os objetos que estão mais tempo no survivor to são movidos para o old e o que restar com referências é copiado para o survivor from. Daí em diante os objetos vem do eden para o survivor to e do survivor from para o to também, fazendo um ping-pong dos objetos antigos que não saíram do survivor entre o to e o from.

O Parallel Mark/Sweep (PS MarkSweep) é o algoritmo que gerencia os objetos mais antigos na memória. Os objetos que ficam mais tempo na memória do Java são promovidos para a área old. Nesta área o gerenciamento de memória marca os objetos que ainda são usados (processo chamado Mark) e depois varre toda a memória no momento do GC apagando aqueles que não tem marcaçãoa alguma (Sweep). Esse processo fragmenta a memória, portanto após finalizado a JVM vai compactar essa memória reduzindo a fragmentação.

  • Receba nosso conteúdo em primeira mão.