Прежде всего, есть эта замечательная статья Алексея Шипилева (бывший инженер JVM в Oracle, теперь в Redhat), в которой объясняется, что это не так просто .
Каждый объект в Java имеет два заголовка, их размеры могут зависеть от платформы или конфигурации, с которой запускается jvm (UseCompressedOops
).
Затем происходит заполнение и выравнивание между полями.и Объекты сами по себе (выравнивание 8 байтов).Кроме того, есть место, которое JVM просто не показывает, потому что оно не может или нуждается в этом.
Все эти вещи делают довольно нетривиальным вычисление размера, который будет иметь определенный Объект в куче;к счастью, JOL существует.У него даже есть много сэмплов ... Вот один маленький пример, предположим, у вас есть такой класс:
static class MyValue {
private final int left;
private final String right;
public MyValue(int left, String right) {
this.left = left;
this.right = right;
}
}
И вы создаете HashMap
:
Map<String, MyValue> map = new HashMap<>();
System.out.println("empty map = " + GraphLayout.parseInstance(map).totalSize());
MyValue one = new MyValue(1, "one");
System.out.println("one = " + GraphLayout.parseInstance(one).totalSize());
map.put("one", one);
System.out.println("map after one = " + GraphLayout.parseInstance(map).totalSize());
MyValue two = new MyValue(1, "two");
map.put("two", two);
System.out.println("map after two = " +
GraphLayout.parseInstance(map).totalSize());