I wrote a simple test.

VO.java is a simple value object class with a couple of Strings and an int as instance fields.

SerTest.java creates a number of instances of VO, inserts them into a HashMap, and then serializes the entire map to a ByteArrayOutputStream. Finally it prints the length of the resulting byte array in KB to standard out.

You specify how many VO instances to put in the HashMap with args[0]. Notice that each VO's "name" field gets a new String object -- not a shared one.

Here are some results. I notice a pattern:

java SerTest 1
size of map = 0.2373046875 kb

java SerTest 10
size of map = 0.5625 kb

java SerTest 100
size of map = 3.990234375 kb

java SerTest 1000
size of map = 40.025390625 kb

java SerTest 10000
size of map = 417.955078125 kb

java SerTest 100000
size of map = 4373.033203125 kb


simarjit singh wrote:

With ByteArrayOutputStream approach, writeObject Method is also serializing
the object. Ofcourse serialization doesn't give size as it is more of a meta
data for the entire web of objects associated with the serialized object.

Rather than writing serialized object on file we  are putting it in a byte
array stream.

What u are getting is NOT bytes for object but bytes for serliazed data


Correct me if i am wrong...

-Simar



You are right, serialization includes "meta data", but, the "bytes for serialized data" certainly *contains* the "bytes for object"! So, while the *absolute* accuracy of this data may be somewhat suspect (serialization overhead needs to be subtracted, for one), the point is that it is more than likely useful and probably gives a good ballpark idea of how big an object is. As I understand it, serialization overhead represents only a fraction of those bytes.


It would be interesting to see a comparison using the other method of determining memory use and see how it comes out!

I'll tell you who would be a good authority on this subject, is Bill Venners over at Artima.com.

Good luck!

Erik



import java.util.HashMap;
import java.io.ObjectOutputStream;
import java.io.ByteArrayOutputStream;

public class SerTest {

 public static void main(String[] args) throws Exception {
        int count = Integer.parseInt(args[0]);
        HashMap map = new HashMap();
        for (int x = 0; x < count; x++) {
          map.put(new Integer(x), new VO(new String("John Doe " + x), 
String.valueOf(x), (int) (Math.random() * 100)));
        }
        printSize(map);
 }

public static void printSize(Object o) throws Exception {
ByteArrayOutputStream bs = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bs);
out.writeObject(o);
out.close();
double size = bs.toByteArray().length;
System.out.println("size of map = " + ((double) (size / 1024D)) + " kb"); }


}


import java.io.Serializable;

public class VO implements Serializable {

 protected String name;
 protected String ID;
 protected int age;

 public VO(String name, String ID, int age) {
        this.name = name;
        this.ID = ID;
        this.age = age;
 }

 public void setName(String name) {
        this.name = name;
 }

 public String getName() {
        return name;
 }

 public void setID(String ID) {
        this.ID = ID;
 }

 public String getID() {
        return ID;
 }

 public void setAge(int age) {
        this.age = age;
 }

 public int getAge() {
        return age;
 }

}







-----Original Message-----
From: Erik Weber [mailto:[EMAIL PROTECTED]
Sent: Thursday, July 08, 2004 10:57 PM
To: Struts Users Mailing List
Subject: Re: [OT] how to calculate the size of an object


Also remember that when you serialize an Object (if I am not mistaken), all the Objects referred to by that Object get serialized too (unless the references are transient). In addition, there is serialization overhead (protocol info that is not actually part of your Object but that is required to deserialize). Your returned size could be misleading if you have references to, say, some "parent" Object(s) in LDIFData, or a ton of serialization overhead (unlikely).

Erik



Erik Weber wrote:



public static long getSize(LDIFData data) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(baos);
out.writeObject(data);
out.close();
return baos.toByteArray().length;
}
catch (Exception e) {
e.printStackTrace();
return -1;
}
}

John Moore wrote:



Navjot Singh wrote:



I use SAX parser to load an LDIF file into memory. Whatsoever data i
read, i fill into an object.

I need to know *the size of LDIFData object* at runtime. How to do
that?

Well the class structure is something like this

public class LDIFData{
ArrayList cards; // collection of Card
String filename;
long lastLoadedTime;
}

public class Card{
String name;
String email
String mobile;
}



Off the top of my head...

Serialize it to a byte array output stream, see how many bytes you have

John



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]





--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]


--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]





--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to