Java GC: as classes de objetos principais promovidos (por tamanho)?
-
22-09-2019 - |
Pergunta
Por favor, deixe -me saber qual é a melhor maneira de determinar a composição da memória da geração jovem promovida à antiga geração, após cada jovem evento do GC?
Idealmente, eu gostaria de conhecer nomes de classes que são responsáveis, por 80% da pilha em cada pedaço de promoção de "jovem geração de geração antiga";
Exemplo: eu tenho 600m Young Gen, cada posse promove 6m; Eu quero saber quais objetos compõem este 6m.
Obrigada.
Solução
Não há maneira fácil de fazer isso, no entanto, recentemente analisei o desempenho da memória de grandes aplicativos Java e posso compartilhar alguma experiência.
Aqui está como eu encontrei quais objetos estão sendo promovidos para a antiga geração:
Primeiro, você precisa identificar quais objetos estão no espaço "antigo/titular". Esta é basicamente sua análise de heap java padrão. Para isso, recomendo o JMAP. Faz parte da JVM Sun. corre:jmap -dump:file=heap.hprof PID
Para obter um despejo de heap. Isso fará uma pausa na JVM durante o despejo (~ por 30 segundos em uma pilha de 2 GB)
Agora carregue o arquivo .prof em Analisador de memória (A melhor ferramenta para isso, sem dúvida) eu passava um dia brincando com o Memory Analyzer para entender, assistir ao Screencam (precisa de um login, mas vale a pena).
Agora você saberá quais objetos estão em sua pilha.
Aqui está o truque: na tela Visão geral do Memory Analyzer, há um link para: "Histograma de objetos inacessíveis". Agora, esses objetos devem ser coletados durante o próximo GC. Mas alguns provavelmente estão no Éden, outros em sobrevivente e outros na antiga.
Agora, obtenha algum perfil com capacidade de perfil de memória, prefiro seu kit. Execute seu aplicativo com o YourKit e registre alocação de objetos.
Execute e grave a criação de objetos. Depois de ter uma lista de objetos criados, use todas as três listas para obter uma imagem do que está acontecendo. Faça o que os humanos fazem de melhor, veja padrões.
- Quais objetos são criados e acessíveis. (Analisador de memória)
- Objetos inacessíveis no Heap (Memory Analyzer)
- Objetos criados durante uma corrida (Profiler)
Outra maneira de abordar é o seukit Visualização de gerações. Você pode tirar instantâneos da sua pilha e comparar quais objetos ainda estão vivos entre os instantâneos. Se você usar isso com VisualGC Você pode determinar quanto tempo um objeto deve estar vivo para ser promovido a Gen Old e tirar instantâneos nesses intervalos para ver quais objetos ainda estão vivos.
Bem, boa sorte. /Jt