В Java два типа данных: raw и производные от Object.
Все типы, производные от Object, несут в себе накладные расходы: дополнительная память в 8 байт, динамическая аллокация, сборка мусора.
Если объект макроскопический, то это несущественно. Но что делать, если надо работать со структурами небольшого размера в больших количествах? Типичный пример: Vec3, в котором три float x, y, z. Накладные расходы за класс размер потребляемой памяти увеличивают почти в два раза.
В C++ все это решается тем, что там можно хранить сложные типы по значению, можно заводить тела сложных локальных переменных на стеке, избегая лишних промежуточных аллокаций.
А как поступают в таких случаях в Java?