Here's a concrete example. First, the Java class:

public class JvmtiSize {

    public static native long getObjectSize(Object o);

    public static void main(String[] args) {
        String s = "Hello, world!";
        String[] sa = { s };

        System.out.printf("    s: %6d bytes\n", getObjectSize(s));
        System.out.printf("   sa: %6d bytes\n", getObjectSize(sa));
        System.out.printf("class: %6d bytes\n",
getObjectSize(JvmtiSize.class));
    }
}

Then, run javah to generate JvmtiSize.h (omitted). Next, the C code
(jvmti_size.c):

#include "jvmti.h"
#include "JvmtiSize.h"

JavaVM *global_jvm = NULL;

JNIEXPORT jint JNICALL
Agent_OnLoad(JavaVM *jvm, char *options, void *reserved) {
  global_jvm = jvm;
  return 0;
}

JNIEXPORT jlong JNICALL
Java_JvmtiSize_getObjectSize(JNIEnv *env, jclass class, jobject object) {
  jint       status;
  jvmtiEnv  *jvmti;
  jvmtiError err;
  jlong      object_size;

  status = (*global_jvm)->GetEnv(global_jvm, (void **)&jvmti, JVMTI_VERSION);
  if (status != JNI_OK) {
    fprintf(stderr,
            "ERROR: Unable to create jvmtiEnv (GetEnv failed), error=%d\n",
            status);
    exit(1);
  }

  err = (*jvmti)->GetObjectSize(jvmti, object,  &object_size);
  if (err != JVMTI_ERROR_NONE) {
    fprintf(stderr,
            "ERROR: GetObjectSize failed, error=%d\n",
            err);
    exit(1);
  }

  return object_size;
}

Then, generate the shared lib (Solaris SPARC):

cc -G -I${JAVA_HOME}/include -Isrc -I${JAVA_HOME}/include/solaris
src/jvmti_size.c -o libjvmti_size.so

Finally, give it a run:

java -agentlib:jvmti_size -cp classes JvmtiSize
    s:     24 bytes
   sa:     16 bytes
class:    288 bytes

Quoting Kris Schneider <[EMAIL PROTECTED]>:

> Not too surprising that it's available through a native programming
> interface
> (JVMTI) since it's really an implementation-dependent metric:
> 
> http://java.sun.com/j2se/1.5.0/docs/guide/jvmti/jvmti.html#GetObjectSize
> 
> Quoting Brian Lee <[EMAIL PROTECTED]>:
> 
> > If you run this from a simple console test app, the JVM won't allocate any
> 
> > extra objects between 2 and 4.
> > 
> > Unfortunatly, this is the most exact way to find out memory usage 
> > (serialization size doesn't necessarily mean in memory size).
> > 
> > Just wait til those slackers at Sun at a Object.sizeof() method in jdk1.9
> or
> > 
> > something lame.
> > 
> > BAL
> > 
> > >From: Navjot Singh <[EMAIL PROTECTED]>
> > >To: Struts Users Mailing List <[EMAIL PROTECTED]>
> > >Subject: Re: [OT] how to calculate the size of an object
> > >Date: Thu, 08 Jul 2004 22:16:12 +0530
> > >
> > >hi,
> > >
> > >Thanks for the link but this is very naive way of doing it. I am leaving
> it
> > 
> > >to the mercy of gc.
> > >
> > >What this method is doing
> > >
> > >1. run gc() manually (AND hope it wont run automatically again soon.)
> > >2. free memory
> > >3. create and object.
> > >4. free memory
> > >
> > >and now just wish that JVM wont allocate any memory in it's heap between 
> > >steps 2 & 4. so that one can assume that whatsoever output comes belongs
> to
> > 
> > >my object. I am at something better.
> > >
> > >Jim you are absolutely right, this technique may return a negative
> number.
> > >
> > >navjot singh
> > >
> > >
> > >[EMAIL PROTECTED] wrote:
> > >
> > >>
> > >>http://www.google.com/search?hl=en&lr=&ie=UTF-8&q=size+java+object
> > >>
> > >>The first one looks promising.
> > >>
> > >>Dennis
> > >>
> > >>
> > >>
> > >>
> > >>*Navjot Singh <[EMAIL PROTECTED]>*
> > >>
> > >>07/08/2004 11:57 AM
> > >>Please respond to
> > >>"Struts Users Mailing List" <[EMAIL PROTECTED]>
> > >>
> > >>
> > >>
> > >>To
> > >>  Struts Users Mailing List <[EMAIL PROTECTED]>
> > >>cc
> > >>
> > >>Subject
> > >>  [OT] how to calculate the size of an object
> > >>
> > >>
> > >>
> > >>
> > >>
> > >>
> > >>
> > >>
> > >>hi,
> > >>
> > >>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;
> > >>}
> > >>
> > >>--
> > >>regards
> > >>Navjot Singh
> > >>
> > >>When you jump for joy, beware that no-one moves the ground from beneath
> > >>your feet. -- Stanislaw Lem, "Unkempt Thoughts"
> > >>
> > >>---------------------------------------------------------------------
> > >>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]
> > >
> > >--
> > >regards
> > >Navjot Singh
> > >
> > >When you jump for joy, beware that no-one moves the ground from beneath
> > >your feet. -- Stanislaw Lem, "Unkempt Thoughts"
> 
> -- 
> Kris Schneider <mailto:[EMAIL PROTECTED]>
> D.O.Tech       <http://www.dotech.com/>

-- 
Kris Schneider <mailto:[EMAIL PROTECTED]>
D.O.Tech       <http://www.dotech.com/>

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

Reply via email to