Então, estou fazendo uma pesquisa sobre como saber a quantidade de memória usada pela jvm e quanto equivale a cada objeto do meu software.
Por exemplo, tenho um sistema que está ocupando 100mb de memoria destes 2mb equivalem a uma lista de objetos (incluindo o tamanho dos meus objetos contidos nessa lista) que esse software possui.
Há algo na linguagem que possa me fornecer informações desse tipo?
Lembrando que não posso usar profilers nem nada do tipo.
Estou pesquisando mas as palavras chaves que uso não tem surtido muito efeito, se não me engano vi uma vez alguém postando um comando que retorna a quantidade atual do consumo de memória da jvm, mas nunca ví de um único objeto em sí.
Bom, vou continuar a pesquisa, se eu encontrar posto aqui, montei esse tópico pra ganhar tempo.
Grato por toda e qualquer ajuda!
Obrigado pela resposta, mas vou reformular minha pergunta, simplificando-a:
Supondo que eu não possa usar um profiler, como posso saber o quanto de memória cada objeto do meu sistema ocupa?
Assim como temos o sizeof no C, o que temos no java semelhante?
Se vc não poder usar um profiler não faz sentido a sua pergunta. Todas as jvm em todos os ambientes suportam profiling.
Portanto, use um profiler ou apresente uma razão tecnica real para a sua impossibilidade de uso.
Em java vc não sabe quanto ocupa um objeto a menos que use um profiler, isso porque a memoria ocupada por um objeto não é apenas derivada dos dados e atributos que ele contém e depende da JVM.
Por métodos arcaicos e tentativa e erro vc poder ter uma estimativa da ocupação, mas não a certeza. Além disso um profiler lhe dá informações especificas classificadas por classe de objeto.
Certo, entendi sergio.
Não queremos instalar um prifiler por ser um métodomuito intrusivo pra levantarmos estatísticas do servidor em produção.
Há modos menos intrusivos de se obter dados com um profiler, sem cliente visual mesmo?
Alguma API, algo do tipo?
Desconheço essa parte…
Vini, muito interessante esse link!
Embora esteja brigndo pra entende-lo hehe ja me passaram algumas ideias pra testar amanha…
Alguma sugestão a mais?
Sergio, como eu poderia aprovetiar esse suporte a profiling da jvm sem instalar um cliente profiler? O problema é justamente esse… dai queria saber os recursos que os profilers usam pra obter aquelas informações, dai usa-los apropriadamente.
[quote=Tchello] Vini, muito interessante esse link!
Embora esteja brigndo pra entende-lo hehe ja me passaram algumas ideias pra testar amanha…
Alguma sugestão a mais?
Sergio, como eu poderia aprovetiar esse suporte a profiling da jvm sem instalar um cliente profiler? O problema é justamente esse… dai queria saber os recursos que os profilers usam pra obter aquelas informações, dai usa-los apropriadamente.
[/quote]
Vc está preocupado que o profilling vá sobrecarregar o sistema enquanto ele está em produção ou está preocupado em não poder instalar um cliente de profiling na máquina onde corre o sistema ?
Para o primeiro problema nem pense nisso. A informação que vc irá retirar de executar o profiling é muito mais importante que a performance. além disso vc não corre o profiling durante dias. Vc corre durante alguns minutos, horas no máximo. Além disso , vc pode correr o profiling em ambiente de desenvolvimento ou de homologação, sem se preocupar em pesar no servidor de produção.
Para o segundo : profiling é sempre eito remotamente. Mesmo quando vc usa o cliente na mesma máquina a comunicação com jvm é remota (protoclo de rede). Portanto, vc pode usar um cliente na sua propria máquina e ligar-se remotamente à jvm do servidor. dependendo do profiler vc tem que iniciar o servidor de um jeito especial para que o profiling esteja disponivel. Lembre-se que profiling é uma feature da jvm como debuging. E ambos sempre são feitos remotamente.
Sérgio, meu caso se encaixa no segundo cenário apontado.
Mas supondo que eu não possa me conectar a jvm remota, na pior das hipóteses, queria gerar essas estatísticas e salva-las para consultar imediatas ou posteriores.
Compreende?
To vendo aquela interface Instrumentation, conforme sugerido acima, consegui coloca-la pra funcionar mas pelo que vi ela só me retorna o tamanho ocupado pela instância daquele objeto, não pelos objetos referenciados, etc e tal, se eu tiver uma List de Strings, por exemplo, ele me retorna apenas o tamanho da List em memória, mas não das String que ela contém.
[quote=Tchello] Sérgio, meu caso se encaixa no segundo cenário apontado.
Mas supondo que eu não possa me conectar a jvm remota, na pior das hipóteses, queria gerar essas estatísticas e salva-las para consultar imediatas ou posteriores.
Compreende?
[/quote]
Então, os profilers têm mecanismos para vc salvar os dados e visualizá-los depois.
Entenda uma coisa, um profiler é a ferramenta que vc precisa usar. qualquer outra coisas será gambiarra.
Connecte-se remotamente , aplique o profiler e seja feliz. É simples, barato e rápido.
Se vc tem problemas tecnicos ou politicos em se conectar à jvm isso são outros 500, mas o seu problema de mediar a memória é resolvido usando um profiler.
[quote=sergiotaborda][quote=Tchello] Sérgio, meu caso se encaixa no segundo cenário apontado.
Mas supondo que eu não possa me conectar a jvm remota, na pior das hipóteses, queria gerar essas estatísticas e salva-las para consultar imediatas ou posteriores.
Compreende?
[/quote]
Então, os profilers têm mecanismos para vc salvar os dados e visualizá-los depois.
Entenda uma coisa, um profiler é a ferramenta que vc precisa usar. qualquer outra coisas será gambiarra.
Connecte-se remotamente , aplique o profiler e seja feliz. É simples, barato e rápido.
Se vc tem problemas tecnicos ou politicos em se conectar à jvm isso são outros 500, mas o seu problema de mediar a memória é resolvido usando um profiler.[/quote]
Eu deixei o profiler aqui rodando um final de semana, num projeto. Acabei pegando um memory leak que o vini me ajudou a resolver. Passavam-se dois dias o o software travava. O profiler é sem dúvida a melhor ferramenta do java.