quantos bytes ocupa o meu objeto na memória?  XML
Índice dos Fóruns » Assuntos gerais (Off-topic)
Autor Mensagem
boaglio
Moderador
[Avatar]

Membro desde: 09/09/2002 21:23:39
Mensagens: 1577
Localização: Sampa City
Offline


Tenho um HashMap meio que gigante e gostaria de saber quanto ele está ocupando na memória.

Buscando no Google achei algumas coisas, e uma solução meio esquisita para fazer o que eu quero.

Conversei com o Paulo Silveira e ele comentou sobre um post no blog do MisterM mostrando o uso da java.lang.instrument.
Infelizmente o exemplo dele dá NPE , talvez por eu usar o Mustang e perceber que na versão 6 mudou bastante.

Alguém tem alguma sugestão ?


 

Eclipse? Netbeans? TextMate? Notepad? Vi? Use whatever gets the job done.
[WWW]
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 13210
Localização: SP
Offline

A maneira mais boba de estimar o tamanho do hashmap é serializá-lo, e multiplicar o resultado por 2 se o hashmap contiver principalmente Strings ou objetos de classes cujos campos são principalmente Strings.
É porque uma String é serializada para UTF-8, ou seja, se cada caracter ocupa 2 bytes na memória, ao ser serializada a String ocupa apenas 1 byte.


Ou então usar um profiler, que lhe dá a informação correta em vez do tamanho chutado que lhe passei.
Se você estiver usando o Java 5.0 ou 6.0 pode tentar usar o jhat (utilitário que vem junto com o JDK).
[WWW]
mister__m
Virtual Machine Man
[Avatar]

Membro desde: 18/03/2005 16:13:17
Mensagens: 703
Offline

boaglio wrote:
Conversei com o Paulo Silveira e ele comentou sobre um post no blog do MisterM mostrando o uso da java.lang.instrument.
Infelizmente o exemplo dele dá NPE , talvez por eu usar o Mustang e perceber que na versão 6 mudou bastante.


Olá Boaglio,

O fato do exemplo não funcionar tem pouco a ver com você estar usando o Mustang e sim pelo fato de eu ter usado o JDK 5 beta, que era o único disponível na época em que escrevi o post, e a API ter mudado pro Java SE 5 final.

Algumas das coisas que mudaram incluem a obrigatoriedade da construção de um jar com o agente, a definição da maioria dos parâmetros que eram passados por comando de linha agora ocorrer como atributos do MANIFEST.MF do jar e outras. Dê uma boa lida na documentação do package java.lang.instrument porque todas estas coisas são explicadas lá.

A única forma mais confiável de calcular o tamanho dos objetos em RAM _talvez seja_ usar a API de debugging do JDK, mas duvido que os resultados entre esta API e o j.l.i variem significativamente.

Michael Nascimento Santos, aka Mister M

Summa Technologies do Brasil - http://www.summa-tech.com/
genesis: Uma nova forma de desenvolver aplicações - https://genesis.dev.java.net/
ThinNB: Suporte a Thinlet no NetBeans - https://thinnb.dev.java.net/
Líder da JSR-310 - Date and Time API
Expert Group Member das JSRs 207 (PD4J), 250 (Common Annotations), 270 (Java 2 SE 6.0), 296 (Swing Framework) e 303 (Bean Validation)
SouJava: Fortalecendo a comunidade Java brasileira - https://soujava.dev.java.net/ https://www.soujava.org.br/
JSR Community @ java.net - http://community.java.net/jsr
Blogs - http://blog.michaelnascimento.com.br/ http://today.java.net/pub/au/80
[WWW]
mister__m
Virtual Machine Man
[Avatar]

Membro desde: 18/03/2005 16:13:17
Mensagens: 703
Offline

thingol wrote:A maneira mais boba de estimar o tamanho do hashmap é serializá-lo...


A diferença entre o tamanho de um objeto serializado e seu tamanho em RAM pode ser brutal devido a diversos fatores. O primeiro e mais óbvio é o formato de serialização e o formato de armazenamento em RAM divergirem, pois o segundo em tese deve ser otimizado para coisas como performance e GC, enquanto o primeiro deveria minimizar o tamanho em disco. Por exemplo, bytes, shorts e ints são armazenados como longs em RAM por algumas VMs, simplesmente porque as operações assembly nativas (e o processo de compilação nativa) acabam sendo mais rápidas se usarem tipos uniformes.

Outro fator é que a spec de serialização prevê mecanismos que permitem a customização do processo, o que possibilitar tornar ainda mais diferente o formato serializado do que seria o formato em RAM.

Michael Nascimento Santos, aka Mister M

Summa Technologies do Brasil - http://www.summa-tech.com/
genesis: Uma nova forma de desenvolver aplicações - https://genesis.dev.java.net/
ThinNB: Suporte a Thinlet no NetBeans - https://thinnb.dev.java.net/
Líder da JSR-310 - Date and Time API
Expert Group Member das JSRs 207 (PD4J), 250 (Common Annotations), 270 (Java 2 SE 6.0), 296 (Swing Framework) e 303 (Bean Validation)
SouJava: Fortalecendo a comunidade Java brasileira - https://soujava.dev.java.net/ https://www.soujava.org.br/
JSR Community @ java.net - http://community.java.net/jsr
Blogs - http://blog.michaelnascimento.com.br/ http://today.java.net/pub/au/80
[WWW]
felipecruz
JavaTeenager

Membro desde: 18/07/2006 10:25:29
Mensagens: 150
Offline

Um profiler nao faz isso não? (alem de outras coisas é claro)


loogica - http://blog.loogica.net
boaglio
Moderador
[Avatar]

Membro desde: 09/09/2002 21:23:39
Mensagens: 1577
Localização: Sampa City
Offline


Obrigado pelas dicas pessoal.

Estou procurando um código de exemplo, alguém poderia indicar ?


 

Eclipse? Netbeans? TextMate? Notepad? Vi? Use whatever gets the job done.
[WWW]
mister__m
Virtual Machine Man
[Avatar]

Membro desde: 18/03/2005 16:13:17
Mensagens: 703
Offline

boaglio wrote:
Estou procurando um código de exemplo, alguém poderia indicar ?


Bem, mais explicado que esse post novo no java.net não dá pra ser.

Michael Nascimento Santos, aka Mister M

Summa Technologies do Brasil - http://www.summa-tech.com/
genesis: Uma nova forma de desenvolver aplicações - https://genesis.dev.java.net/
ThinNB: Suporte a Thinlet no NetBeans - https://thinnb.dev.java.net/
Líder da JSR-310 - Date and Time API
Expert Group Member das JSRs 207 (PD4J), 250 (Common Annotations), 270 (Java 2 SE 6.0), 296 (Swing Framework) e 303 (Bean Validation)
SouJava: Fortalecendo a comunidade Java brasileira - https://soujava.dev.java.net/ https://www.soujava.org.br/
JSR Community @ java.net - http://community.java.net/jsr
Blogs - http://blog.michaelnascimento.com.br/ http://today.java.net/pub/au/80
[WWW]
eric_jf
JavaEvangelist

Membro desde: 07/07/2006 12:28:12
Mensagens: 370
Offline

Não tenho certeza mas acho q plugin Eclipse Test & Performance Tools Platform (TPTP) tem como ver isso.

http://www.eclipse.org/tptp/
leandro_bortolotto
Thread.start()

Membro desde: 25/05/2006 16:43:41
Mensagens: 45
Offline

Bom dia,

Você conseguiu descobrir o tamanho em bytes de seu HashMap?

Vlw
Kenobi
Forum Spammer
[Avatar]

Membro desde: 14/11/2003 13:06:37
Mensagens: 1259
Localização: Brasil
Offline

A JDK tem uma série de Tools e utilitários que servem exatamente para esse e os mais variados propósitos.

Dê uma olhada nesse em especial que é para o seu problema : http://java.sun.com/javase/6/docs/technotes/tools/share/jmap.html

Aqui você tem a página que descreve os tools - http://java.sun.com/javase/6/docs/technotes/tools/index.html#troubleshoot

Para a versão 5 vc tem um outro software - http://oss.metaparadigm.com/jmemprof/ .

Vi dois artigos bons sobre o tema, mas não falava especificamente de memória e sim profiler via AOP na IBM - http://www-128.ibm.com/developerworks/java/library/j-aopwork10/


Agora se você quiser fazer automaticamente gerando até gráficos, aconselho a utilizar o NetBeans Profiler que era o JFluid , projeto separado da Sun Microsystems ... excelente ferramenta, já o utilizei em diversos casos

------------------------------------------------------------------
"Massakatsu Agatsu Katsuhaiabi" - "A verdadeira vitória é aquela sobre nós mesmos".
[WWW] [MSN] [ICQ]
 
Índice dos Fóruns » Assuntos gerais (Off-topic)
Ir para:   
Apoiado e desenvolvido por Caelum Cursos Java - Powered by JForum 2.1.8 © JForum Team