Это, очевидно, определяется реализацией, поскольку спецификация Java не дает никаких гарантий относительно этого материала. Для современной виртуальной машины: 2 слова на объект (а точнее, по крайней мере, 1 слово для переменных, даже если у объекта их нет). Теперь вам в основном приходится считать. Каждый объект должен быть выровнен по 8 байтов.
В качестве примера давайте посмотрим на DirectByteBuffer: мы видим, что он хранит один объект (1 слово). Теперь, если он разделяет этот объект с чем-то другим, вы можете или не можете считать его. Если вы посчитаете его, вам нужно будет выяснить, какой объект хранится, а также рассчитать его размер (поэтому зависит от вашего точного пути к коду). Поскольку DirectByteBuffer расширяет класс, вам необходимо добавить к нему и этот размер.
Да, это довольно сложная работа, и я уверен, что, черт возьми, она этого не сделает;) Но все довольно просто. Я считаю как минимум 3 ссылки и 29 байтовых примитивов.