Classe Java versus tamanho da memória da matriz?

9

Eu tenho que armazenar milhões de pares duplos X / Y para referência no meu programa Java. Eu gostaria de manter o consumo de memória o mais baixo possível, bem como o número de referências de objetos. Então, depois de pensar que eu decidi segurar os dois pontos em uma minúscula matriz dupla pode ser uma boa idéia, é a configuração assim:

double[] node = new double[2];
node[0] = x;
node[1] = y;

Eu percebi que usar o array evitaria o link entre a classe e minhas variáveis X e Y usadas em uma classe, como segue:

class Node {
     public double x, y;
}

No entanto, depois de ler como os campos públicos em classes são armazenados, percebi que os campos podem não estar estruturados como estruturas de ponteiro, talvez a JVM esteja simplesmente armazenando esses valores em uma memória contígua e saiba como encontrá-los sem um endereço, tornando a representação de classe do meu ponto menor que a matriz.

Então a questão é, qual tem um tamanho menor de memória? E por quê?

Estou particularmente interessado em saber se os campos de classe usam ou não um ponteiro e, portanto, têm uma sobrecarga de 32 bits ou não.

    
por Cody Smith 04.09.2012 в 01:18
fonte

3 respostas

5

O último tem a menor pegada.

Os tipos primitivos são armazenados em linha na classe que os contém. Portanto, seu Node requer um cabeçalho de objeto e dois slots de 64 bits. A matriz que você especificar usa um cabeçalho de matriz (> = um cabeçalho de objeto) plush dois slots de 64 bits.

Se você vai alocar 100 variáveis dessa maneira, então não importa muito, pois são apenas os tamanhos dos cabeçalhos que são diferentes.

Advertência: tudo isso é um tanto especulativo, já que você não especificou a JVM - alguns desses detalhes podem variar de acordo com a JVM.

    
por Keith Randall 04.09.2012 / 01:23
fonte
0

Eu não acho que o seu maior problema seja armazenar os dados, eu acho que ele vai estar recuperando, indexando e manipulando.

No entanto, uma matriz, fundamentalmente, é o caminho a percorrer. Se você deseja salvar em ponteiros, use uma matriz unidimensional. (Alguém já disse isso).

    
por alvonellos 04.09.2012 / 01:39
fonte
0

Primeiro, deve-se afirmar que o uso real do espaço depende da JVM que você está usando. É estritamente implementação específica. O seguinte é para uma JVM mainstream típica.

  

Então a questão é, qual tem um tamanho menor de memória? E por quê?

A segunda versão é menor. Uma matriz tem a sobrecarga do campo de 32 bits no cabeçalho do objeto que contém o comprimento da matriz. No caso de um objeto não-array, o tamanho é implícito na classe e não precisa ser representado separadamente.

Mas note que esse é um objeto de matriz fixo acima da cabeça. Quanto maior a matriz, menos importante é a sobrecarga em termos práticos. E o outro lado de usar uma classe em vez de array é que a indexação não funcionará e seu código pode ser mais complicado (e mais lento) como resultado.

Um array Java 2D é, na verdade, uma matriz de matrizes 1D (etc), para que você possa aplicar a mesma análise a matrizes com maior dimensionalidade. Quanto maior o tamanho que uma matriz tem em qualquer dimensão, menor o impacto da sobrecarga. A sobrecarga em uma matriz 2x10 será menor que em uma matriz 10x2 . (Pense em ... 1 array de comprimento 2 + 2 de comprimento 10 versus 1 array de tamanho 10 + 10 de comprimento 2. O overhead é proporcional ao número de matrizes.)

  

Estou particularmente interessado em saber se os campos de classe usam ou não um ponteiro e, portanto, têm uma sobrecarga de 32 bits ou não.

(Você está realmente falando sobre campos de instância, não campos de classe. Esses campos não são static ...)

Campos cujo tipo é um tipo primitivo são armazenados diretamente no nó heap do objeto sem nenhuma referência. Não há sobrecarga de ponteiro nesse caso.

No entanto, se os tipos de campo forem tipos de invólucro (por exemplo, Double em vez de double ), poderá haver a sobrecarga de uma referência E as despesas gerais do cabeçalho do objeto Double .

    
por Stephen C 04.09.2012 / 02:46
fonte