snippetjavaCritical
How to determine the size of an object in Java
Viewed 0 times
objecthowjavadeterminethesize
Problem
I have an application that reads a CSV file with piles of data rows. I give the user a summary of the number of rows based on types of data, but I want to make sure that I don't read in too many rows of data and cause
Right now, I have code that says read up to 32,000 rows, but I'd also like to have code that says read as many rows as possible until I've used 32MB of memory.
OutOfMemoryErrors. Each row translates into an object. Is there a way to find out the size of that object programmatically? Is there a reference that defines how large primitive types and object references are for a VM?Right now, I have code that says read up to 32,000 rows, but I'd also like to have code that says read as many rows as possible until I've used 32MB of memory.
Solution
You can use the
Compile and put this class in a JAR:
Add the following to your
Use the
Invoke with:
java.lang.instrument package.Compile and put this class in a JAR:
import java.lang.instrument.Instrumentation;
public class ObjectSizeFetcher {
private static Instrumentation instrumentation;
public static void premain(String args, Instrumentation inst) {
instrumentation = inst;
}
public static long getObjectSize(Object o) {
return instrumentation.getObjectSize(o);
}
}Add the following to your
MANIFEST.MF:Premain-Class: ObjectSizeFetcherUse the
getObjectSize() method:public class C {
private int x;
private int y;
public static void main(String [] args) {
System.out.println(ObjectSizeFetcher.getObjectSize(new C()));
}
}Invoke with:
java -javaagent:ObjectSizeFetcherAgent.jar CCode Snippets
import java.lang.instrument.Instrumentation;
public class ObjectSizeFetcher {
private static Instrumentation instrumentation;
public static void premain(String args, Instrumentation inst) {
instrumentation = inst;
}
public static long getObjectSize(Object o) {
return instrumentation.getObjectSize(o);
}
}Premain-Class: ObjectSizeFetcherpublic class C {
private int x;
private int y;
public static void main(String [] args) {
System.out.println(ObjectSizeFetcher.getObjectSize(new C()));
}
}java -javaagent:ObjectSizeFetcherAgent.jar CContext
Stack Overflow Q#52353, score: 490
Revisions (0)
No revisions yet.