Pessoal, tenho um servidor glassfish rodando uma aplicação em produção.
Precisava saber quantas instâncias de uma determinada classe estão criadas na jvm. Existe como fazer isso?
oi lean, através de um profilador man
acho que a visualvm pode ajudar:
http://visualvm.java.net/
abrasss
Você pode usar o jhat .
De modo geral:
a) Determine qual é o pid do programa Java
b) Use jmap -dump para criar um arquivo de dump
c) Rode o jhat com esse arquivo de dump para determinar quantas instâncias estão carregadas.
Para mais detalhes, veja:
http://docs.oracle.com/javase/6/docs/technotes/tools/share/jhat.html
http://docs.oracle.com/javase/6/docs/technotes/tools/share/jmap.html
O jvisualvm também faz isso que eu falei. Só que se o seu servidor estiver ocupando memória demais, talvez você não consiga atachar o jvisualvm e precise de usar o jmap mesmo.
Não se esqueça da opção -J-Xmx512m para passar ao jhat, senão se o arquivo de dump for muito grande, o jhat cai.
pegando embalo no tópico entanglement quanto se tira um heap dump pelo jvisualvm ao observar as classes, o que fica alocado no byte[] e char[]? que por sinal é o que tem o maior número de instâncias.
Todo objeto String referencia um array de char - mesmo no caso de strings vazias.
Pode ser que várias strings referenciem o mesmo array de char (isso tipicamente ocorre para strings criadas pelo método java.lang.String.substring()).
No caso de byte[], depende muito do que você está usando. Pode ser, por exemplo, que você esteja usando serialização de objetos; nesse caso, em algum ponto será necessário converter de/para um array de bytes.
entanglement por que o que acontecendo comigo é o seguinte eu to usando uma dll que faz a leitura de um arquivo binário criado em C , essa dll e carregada usando jna e o byte[] se monitorado
pelo jvisualvm ele sempre esta cheio a quantidade de memória usada por ele e bem grande.
Já tava lendo o doc do jna e em classes que extends Structure tem um método clean() que deveria limpar os ponteiros alocados e na classe Memory tem um método purge() que deveria forçar tal limpeza
mais não funcionou muito não… poderia ser esse o motivo desse consumo de memória pelo byte[]?
Boa pergunta. Não sei como o JNA funciona por dentro (não tenho o código dele aqui), portanto não sei como ele faz com arrays de bytes alocados para que ele use.
Se fosse JNI puro, eu diria exatamente o que fazer.
e essa função que você está chamando via DLL, como ela é declarada? Você passa uma Structure(do JNA) para ela?
[quote=wellington.nogueira][quote=entanglement]Boa pergunta. Não sei como o JNA funciona por dentro (não tenho o código dele aqui), portanto não sei como ele faz com arrays de bytes alocados para que ele use.
Se fosse JNI puro, eu diria exatamente o que fazer. [/quote]
Fiquei curioso. Há como forçar via java que uma dll faça uma limpeza de seus ponteiros?
Pq qdo uso malloc + free, as vezes tomo uns erros que matam a aplicação. Mas removendo o free, tudo funciona (mas os malloc executados, acredito, não são liberados da memória).
[edit] estou usando JNI [/edit][/quote]
Cara com JNI acho que não e possível forçar essa limpeza, tu tem que fazer no braço mesmo… mais como eu disse acima usando JNA tem o método clean() da Structure e o método purge()
da Memory.
[quote=entanglement]Boa pergunta. Não sei como o JNA funciona por dentro (não tenho o código dele aqui), portanto não sei como ele faz com arrays de bytes alocados para que ele use.
Se fosse JNI puro, eu diria exatamente o que fazer. [/quote]
Fiquei curioso. Há como forçar via java que uma dll faça uma limpeza de seus ponteiros?
Pq qdo uso malloc + free, as vezes tomo uns erros que matam a aplicação. Mas removendo o free, tudo funciona (mas os malloc executados, acredito, não são liberados da memória).
[edit] estou usando JNI [/edit]