Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java class vs array memory size?

I have to store millions of X/Y double pairs for reference in my Java program. I'd like to keep memory consumption as low as possible as well as the number of object references. So after some thinking I decided holding the two points in a tiny double array might be a good idea, it's setup looks like so:

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

I figured using the array would prevent the link between the class and my X and Y variables used in a class, as follows:

class Node {
     public double x, y;
}

However after reading into the way public fields in classes are stored, it dawned on me that fields may not actually be structured as pointer like structures, perhaps the JVM is simply storing these values in contiguous memory and knows how to find them without an address thus making the class representation of my point smaller than the array.

So the question is, which has a smaller memory footprint? And why?

I'm particularly interested in whether or not class fields use a pointer, and thus have a 32-bit overhead, or not.

like image 840
Cody Smith Avatar asked Sep 03 '12 23:09

Cody Smith


People also ask

How much memory does an array use Java?

The memory allocation for an array includes the header object of 12 bytes plus the number of elements multiplied by the size of the data type that will be stored and padding as needed for the memory block to be a multiple of 8 bytes.

Do arrays take less memory than Arraylists?

So ArrayList requires more memory consumption than simple Arrays, but you can continue to use then in small programs that wont make much of a difference but when dealing with large ammout of data and performance issues, if you can go with simple arrays dont use ArrayList as Arrays are much faster.

Do Arraylists use more memory than arrays?

We should note that ArrayList is a good solution for a flexible-sized container of objects that is to support random access. It consumes slightly more memory than an array but provides a richer set of operations.


1 Answers

The latter has the smaller footprint.

Primitive types are stored inline in the containing class. So your Node requires one object header and two 64-bit slots. The array you specify uses one array header (>= an object header) plust two 64-bit slots.

If you're going to allocate 100 variables this way, then it doesn't matter so much, as it is just the header sizes which are different.

Caveat: all of this is somewhat speculative as you did not specify the JVM - some of these details may vary by JVM.

like image 131
Keith Randall Avatar answered Oct 20 '22 00:10

Keith Randall