import java.util.ArrayList; import java.util.List; import org.openjdk.jol.info.ClassLayout; import org.openjdk.jol.info.GraphLayout; import org.openjdk.jol.vm.VM; /** * JEP 534 seen from the inside: how many bytes does each object spend on its header, and what * does that add up to across a million objects? * *
Uses JOL 0.17 ({@code org.openjdk.jol:jol-core}). Explained in docs/03-compact-headers.md.
* Run by scripts/object-headers.sh, once per JDK.
*/
public class HeaderDemo {
/** Two ints. The smallest object that is not empty. */
static class Point {
int x;
int y;
}
/** A more typical mix: a long, an int, a boolean and a reference. */
static class Order {
long id;
int quantity;
boolean paid;
String customer;
}
public static void main(String[] args) {
System.out.println("java.version = " + System.getProperty("java.version"));
System.out.println(VM.current().details());
section("java.lang.Object");
System.out.println(ClassLayout.parseClass(Object.class).toPrintable());
section("Point { int x; int y; }");
System.out.println(ClassLayout.parseClass(Point.class).toPrintable());
section("Order { long id; int quantity; boolean paid; String customer; }");
System.out.println(ClassLayout.parseClass(Order.class).toPrintable());
section("java.lang.Long and java.lang.Integer (boxed values)");
System.out.println(ClassLayout.parseInstance(Long.valueOf(123_456_789L)).toPrintable());
System.out.println(ClassLayout.parseInstance(Integer.valueOf(123_456)).toPrintable());
section("int[3]");
System.out.println(ClassLayout.parseInstance(new int[3]).toPrintable());
section("What it adds up to: one million objects");
List