Playing with the Tiger: Measuring the size of your objects
As I said, I'm back with more on the new JDK 1.5.
There is a new package called java.lang.instrument that allows you to intercept a class before being loaded and modify its bytecode, for example (can I hear standard entry point for AOP support? :-P). Well, let's use it for something different: measuring the size of some objects. Here is the code:
import java.lang.instrument.*;
import java.util.*;
public class InstrumentationTest {
private static Instrumentation inst;
public static void premain(String options, Instrumentation inst) {
InstrumentationTest.inst = inst;
System.out.println("options= " + options);
// Get all classes currently loaded by VM
Class[] loaded = inst.getAllLoadedClasses();
// Sort them by name
Arrays.sort(loaded, new Comparator() {
public int compare(Class c1, Class c2) {
return c1.getName().compareTo(c2.getName());
}
});
//And print them!
for (Class clazz : loaded) {
System.out.println(clazz);
}
}
public static long sizeOf(Object o) {
assert inst != null;
return inst.getObjectSize(o);
}
public static void main(String[] args) {
System.out.println("Size of Object: " + sizeOf(new Object()));
System.out.println("Size of direct subclass: " + sizeOf(
new InstrumentationTest()));
System.out.println("Size of Calendar: " + sizeOf(Calendar.getInstance()));
}
}
Save it as InstrumentationTest.java and compile it as shown bellow:
javac -source 1.5 InstrumentationTest.java
To allow our class to be useful, we have to start the VM using this verbose command:
java -ea -javaagent:InstrumentationTest -cp . InstrumentationTest
Someone might be asking how it could be useful. As a friend of mine, Bruno Borges, suggested to me, it could give you a good idea if Prevayler is the right tool for your needs.
Hope you've enjoyed it. More to come!
- Login or register to post comments
- Printer-friendly version
- mister__m's blog
- 2781 reads





