Pergunta

Quero obter um despejo do Permgen para ver por que está preenchendo. Existe uma maneira de analisar isso? Eu já conheço os suspeitos comuns como Log4J, recarregamento do TomCat WebApp etc., mas também tenho algum código de geração de proxy personalizado no meu aplicativo e só quero olhar para baixo.

Isso é possível de alguma forma?

Foi útil?

Solução

O Permgen normalmente consiste no pool literal de cordas e em classes carregadas. Para responder parte do seu problema, ou seja, o pool literal de cordas, escrevi uma utilidade para imprimir um pool literal de string da JVM em execução. Está disponível aqui:

https://github.com/puneetlakhina/javautils/blob/master/src/com/blogspot/sahyog/printstringtable.java

É baseado em Permstat, que é a classe usada para imprimir estatísticas permgen pela ferramenta JMAP.

Outras dicas

Você pode usar as bandeiras:

-XX:+TraceClassLoading -XX:+TraceClassUnloading

Eles imprimem as identidades das classes à medida que são carregadas/descarregadas da geração permanente. Se você adicionar -XX:+PrintGCDetails Você também pode rastrear o tamanho do permgen.

Observe que não tenho certeza se as bandeiras são suportadas em JVMs que não sejam do Sun.

Outro suspeito de Permgen fora da memória-erros é Internação de string. Verifique os lugares onde você estagiou strings em seu código.

Se você deseja obter uma lista de todas as classes carregadas, você pode usar jconsole. Clique na guia Classes e clique em "Saída detalhada". Que imprimirá cada classe que é carregada para stdout. Achei esse rastreamento muito útil em um problema de classe de proxy do JAXB.

Você pode ter que iniciar seu aplicativo com o -Dcom.sun.management.jmxremote opção de linha de comando para jconsole para anexar a ele.

Vai jmap -permgen se encaixar na conta?

Veja o guia de solução de problemas para Javahttp://java.sun.com/javase/6/webnotes/trouble/tsg-vm/html/memleaks.html#gbyuu

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