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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top