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 / May 2006

Tip: Looking for answers? Try searching our database.

How to measure the size of an object?

Thread view: 
Scirious - 26 May 2006 20:05 GMT
People, how can I know how big an object is? I mean, I have an object the
collects data from a stream and when it grows to an especific size I need
to create a new object to continue collecting the data and send the other
one to a thread that records it's content to the disk.

How do I do such thing?

TIA,
Scirious.
Oliver Wong - 26 May 2006 22:24 GMT
> People, how can I know how big an object is? I mean, I have an object the
> collects data from a stream and when it grows to an especific size I need
> to create a new object to continue collecting the data and send the other
> one to a thread that records it's content to the disk.
>
> How do I do such thing?

   Are you sure it's the object's size you need, and not, for example, the
size of the buffer within that object?

   How about whenever you collect a unit of data, you increment a counter?

   - Oliver
Scirious - 29 May 2006 14:52 GMT
>     Are you sure it's the object's size you need, and not, for
>     example, the
[quoted text clipped - 4 lines]
>
>     - Oliver

Actually, I'm not! The thing is, I've already seen the JVM misbehave when
it uses a lot of memmory. Lets say, for example, If I have 750 MB of RAM
and an object needs to store 1.5+ GB of data my system  or the JVM is
likely to crash. So, for example, I'm writing an e-mail client and I have
an object to store the headers I download from the server. I may want to
specify that, after downloading 250 MB of headers, I want them to be
recorded on disc so the object can give place to a new one and be collected
from memory.

This way I avoid the possibility of an object getting as big as 1 GB. But
to do so I need a way to measure the size it has and, implementing a
counter is not the best way sisnce the size of the headers may differ from
message to message.

Scirious.
Oliver Wong - 29 May 2006 15:18 GMT
[Crossposted to comp.lang.java.programmer, since more people lurk there]

>>> People, how can I know how big an object is? I mean, I have an object
>>> the
[quoted text clipped - 5 lines]
>>>
>>> How do I do such thing?

I wrote:

>>     Are you sure it's the object's size you need, and not, for
>>     example, the
>> size of the buffer within that object?
>>
>>     How about whenever you collect a unit of data, you increment a
>>     counter?

OP responds:

> Actually, I'm not! The thing is, I've already seen the JVM misbehave when
> it uses a lot of memmory. Lets say, for example, If I have 750 MB of RAM
[quoted text clipped - 10 lines]
> counter is not the best way sisnce the size of the headers may differ from
> message to message.

   Not sure the best way to solve this one, which is why I'm crossposting
it to c.l.j.programmer, so others can contribute.

   I've read about one technique but never tried it: Allocate a big chunk
of memory at the start of your program, do your memory operation which might
result in an OutOfMemoryException (OOME), catch it, release the big chunk of
memory that you got, so you now have some wiggle room to work with,
serialize the buffer to disk, re-allocate another big chunk of memory (and
assert that it doesn't fail, since you're supposed to have a lot of free
memory after the serialization), and repeat.

   - Oliver
Robert Klemme - 29 May 2006 16:09 GMT
> [Crossposted to comp.lang.java.programmer, since more people lurk there]
>
[quoted text clipped - 45 lines]
> chunk of memory (and assert that it doesn't fail, since you're supposed
> to have a lot of free memory after the serialization), and repeat.

In this scenario I'd just count downloaded bytes (I guess this is what
you meant by "counter" above).  As easy as that.   With a limit of 250MB
some bytes overhead for reference to an object's class etc. are negligible.

And I think you also correctly pointed out that "the size of an object"
is a too fuzzy term to deal with.  Strictly speaking, the size of an
object is 8 bytes + 4 * size of an object reference + size of any POD
data members (roughly, I'm not 100% sure about the figures).  But then
again, for a String you would certainly also want to count the size of
the char array that holds the actual string data etc.  Matters become
even more complicated when two strings share the same array, e.g. you
use this constructor: public String(String original).  Does the char
array count for each of them?  Or is half the length counted for each of
them?  This becomes even more complex with collections and user defined
classes...

Kind regards

    robert
Oliver Wong - 29 May 2006 16:44 GMT
>> "Scirious" <scirious@scirious.com> wrote in message

>>> So, for example, I'm writing an e-mail client and I have
>>> an object to store the headers I download from the server. I may want to
>>> specify that, after downloading 250 MB of headers, I want them to be
>>> recorded on disc so the object can give place to a new one and be
>>> collected
>>> from memory.
[...]
> In this scenario I'd just count downloaded bytes (I guess this is what you
> meant by "counter" above).  As easy as that.   With a limit of 250MB some
> bytes overhead for reference to an object's class etc. are negligible.

   I think it's a bit trickier than that. Let's say the downloaded bytes
are 0x48, 0x65, 0x6C, 0x6C, 0x6F. I.e. the string "Hello" if decoded using
ASCII. If the program then takes these 5 bytes and stores them as a String,
the JVM is likely to use UTF-16 internally, which will result in 10 bytes
being used (2 for each character).

   If the downloaded bytes UTF-8 instead of ASCII, and some of the
characters were above codepoint 256, then the calculation is not simply a
matter of doubling the downloaded bytes. Some characters will have taken 1
byte to download, 2 bytes to store; others will have taken 2 bytes to
download, 2 bytes to store. Still others, 3 bytes to download, 2 bytes to
store; 3 bytes to download, 3 bytes to store, and so on with various other
combinations.

   - Oliver
Robert Klemme - 30 May 2006 08:22 GMT
>>> "Scirious" <scirious@scirious.com> wrote in message
>
[quoted text clipped - 24 lines]
> 2 bytes to store; 3 bytes to download, 3 bytes to store, and so on with
> various other combinations.

Maybe I wasn't clear enough: I meant, ignore real sizes and just use the
bytecount as limit - alternatively, if the data is converted to chars
then use the char count as limit.  I wouldn't bother to think about
actual sizes in bytes - the important part for me would be that there is
a *limit* to the size.

Kind regards

    robert


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.