Memory Alignment na JVM

Estava pesquisando e me assustei com o memory alignment (alinhamento de memória) do java. Pelo que eu vi, a JVM alinha a memória em 8 bytes! Ou seja, não importa se tu criar um short, int ou long, qualquer um deles ocupará 8 bytes na memoria.

Parece pouco, mas pense num software que tenha 125000000 (cento e vinte e cinco milhões) de entradas em que o brilhante programador usou short pensando que ocuparia menos memória ou 4 bytes (o alinhamento padrão em i386 e como é o alinhamento em C), mas ocupando 8 bytes! De aproximadamente 500 megabytes (alinhando em 4bytes) ocupará 1 gigabyte! Ah sim, não preciso dizer que serão 125 milhões de instancias e não um objeto com 125 milhões de shorts.

As únicas justificativas para o alinhamento em 8bytes é que cada instância de Object ocupa 8bytes, então eles decidiram que será alinhado por Object ou então, por causa dos processadores de 64 bits, mas não sei o que impede de em processadores 32bits ter alinhamento em 4bytes. É.. java não é lento, concordo, mas que é bloat é…

Ah, recomendo a leitura deste texto, que é uma classe que calcula o tamanho ocupado na memória de uma classe considerando o alinhamento da memória.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s