Мой вопрос связан с объемом потребляемой памяти в Java для класса без элемента данных. Предположим в Java, у меня есть класс, который не имеет элемента данных, и он только содержит методы. Таким образом, если я создаю экземпляр конкретного класса, затем делает он занимает память в основной памяти кроме памяти ссылки на объект?
В конечном счете, каждый объект Java знает свой класс и может иметь примитив синхронизации, необязательно присоединенный к нему (хотя this
может быть синтетическим). Это две ссылки, без которых трудно сделать экземпляр java.lang.Object
. Все остальное является производным от этого класса, поэтому у вас есть минимальный уровень затрат, который в Java 1.3.1 составил не менее 8 байт. Профайлер сообщит вам текущие расходы, если они вам действительно нужны.
Да, это так, потому что как минимум даже «пустой» объект имеет указатель на информацию о своем типе.
Тестирование памяти затруднено из-за различных источников помех (растущая куча, GC), но попробовать все же стоит:
public static void main(String[] args)
{
final int n = 1000000;
final Runtime runtime = Runtime.getRuntime();
final Object[] objects = new Object[n];
final long memory0 = runtime.totalMemory() - runtime.freeMemory();
for (int i = 0; i < objects.length; i++)
{
objects[i] = new Object();
}
final long memory1 = runtime.totalMemory() - runtime.freeMemory();
final long memory = memory1 - memory0;
System.out.printf(
"%s %s\n",
System.getProperty("java.vm.name"),
System.getProperty("java.vm.version"));
System.out.printf("%d %d %.1f\n", n, memory, 1.0 * memory / n);
}
Java HotSpot ™ Server VM 14.3-b01 1000000 8000336 8,0
Давайте внесем ясность. Ссылки на ваш объект, конечно, будут занимать место. Но ваш объект также займет место для своего указателя 'this' (т.е. для того, чтобы вы могли различать разные экземпляры), а также для полей любых суперклассов - например, Object - и, наконец, для любых накладных расходов на внутренние структуры данных кучи.