Estratégia de alocação de memória e reciclagem
- Visão geral
- Os objetos são distribuídos principalmente no distrito Eden da nova geração.
- Se o buffer de encadeamento local (tlab) for iniciado, a prioridade será alocada de acordo com o encadeamento.
- Alguns objetos grandes serão alocados diretamente na geração antiga.
- As regras de alocação não são fixas e dependem principalmente da combinação do coletor de lixo e das configurações de parâmetros relacionadas.
- -XX: + PrintGCDetails
- Imprimir informações do GC
- Os objetos são alocados primeiro no Eden
- Quando o Eden não é contínuo o suficiente para alocar objetos, o GC Menor é acionado para transferir os objetos vivos do Eden e os objetos Survivor para outro Survivor.
- Se o espaço do Survivor não for suficiente para armazenamento, ele será transferido para a geração antiga com antecedência através do mecanismo de garantia de alocação.
- Objetos grandes vão diretamente para a geração antiga
- Objetos grandes: objetos que requerem muito espaço de memória contínuo.
- -XX: PretenureSizeThreshold = xxx byte
- Defina o limite para objetos grandes. Fazer objetos maiores que essa configuração vale a pena atribuir diretamente na geração antiga.
- O objetivo é evitar muita cópia de memória entre a área de Eden e as duas áreas de Survivor.
- Suporta apenas Serial e ParNew
- Objetos de vida longa entram na velhice
- Contador de idade do objeto
- Quando o sujeito primeiro Gc menor e passa para o Survivor, a idade do sujeito é definida em 1.
- Após cada experiência de GC Menor no Survivor, envelheça +1;
- Quando a idade aumenta para um determinado nível (padrão 15), é promovida para a idade avançada
- -XX: MaxTenuringThreshold
- Determinação dinâmica da idade do objeto
- Se a soma do tamanho de todos os objetos no espaço Survivor da mesma idade for maior que a metade do espaço Survivor, todos os objetos maiores ou iguais à idade entrarão diretamente na idade avançada.
- Garantia de alocação de espaço
- Antes do GC Menor, a máquina virtual verificava se o maior espaço contíguo disponível na geração antiga era maior que o tamanho de todos os objetos da nova geração ou o tamanho médio das promoções anteriores.
- Se for maior, considera-se que ele executa GC menor, caso contrário, GC completo
- Antes da versão 1.6, o início era verificar o tamanho de todos os objetos da nova geração: se passasse, o GC menor seria usado diretamente. Se não for aprovado, é julgado se o valor de configuração de HandlePromotionFailure permite que a garantia falhe. Se permitido, o GC menor será executado apenas se for considerado maior que o tamanho médio das gerações anteriores. Caso contrário, o parâmetro não é permitido ou o tamanho não é permitido. GC completo