Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / General / June 2007

Tip: Looking for answers? Try searching our database.

Memory allocation

Thread view: 
Momo - 05 Jun 2007 17:51 GMT
Hi,

    Something was puzzling me about when I will run out of memory. I have
a simple program, that does nothing but take size as the input, and
then allocates a boolean array with x=new boolean[size]. I throw an
OutOfMemoryError when size is greater than about 6*10^7.

    If I then change the program to allocate a boolean array with y=new
boolean[size][4], I get the Error when size is greater than about
3*10^6. I would have thought that double-scripting the array to be
length 4, I would make the maximum value of size roughly 1/4th as
large. But instead it changes by a factor of 20. Why such a big
change?

    This is not an actual problem for me, since I just increased the size
of the java heap space. But I'd like to understand where the factor of
20 comes from.

Momo
Kai Schwebke - 05 Jun 2007 18:37 GMT
> large. But instead it changes by a factor of 20. Why such a big
> change?

boolean[n] consumes (most likely) c + n bytes.

boolean[n][4] is one array of n references to n arrays of 4 bytes.

Arrays are instances of class Array and consume (most likely)
from 12 to 16 bytes{1}. The reference may need additional 4 bytes.
All of this n times, leading to a quite high overhead.

You may consider using a bitset and a calculated index
(e.g. index = 4*a + b) to reduce the required heap space
to c + n/8 bytes.

Kai

{1} see http://martin.nobilitas.com/java/sizeof.html
Patricia Shanahan - 05 Jun 2007 19:27 GMT
>> large. But instead it changes by a factor of 20. Why such a big
>> change?
[quoted text clipped - 10 lines]
> (e.g. index = 4*a + b) to reduce the required heap space
> to c + n/8 bytes.

Transposing would be simpler, and get most of the memory reduction.
boolean[4][n] is one array of four references to four arrays of n booleans.

Patricia
Momo - 05 Jun 2007 19:53 GMT
> > large. But instead it changes by a factor of 20. Why such a big
> > change?
[quoted text clipped - 6 lines]
> from 12 to 16 bytes{1}. The reference may need additional 4 bytes.
> All of this n times, leading to a quite high overhead.

Thank you!

> You may consider using a bitset and a calculated index
> (e.g. index = 4*a + b) to reduce the required heap space
> to c + n/8 bytes.

I changed it to four Bitsets a few days ago, so it turns out that I
fixed it, I just didn't know why I fixed it.

Momo


Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.