Действительно классифицирует без элемента данных, имеют объем потребляемой памяти в Java?

Мой вопрос связан с объемом потребляемой памяти в Java для класса без элемента данных. Предположим в Java, у меня есть класс, который не имеет элемента данных, и он только содержит методы. Таким образом, если я создаю экземпляр конкретного класса, затем делает он занимает память в основной памяти кроме памяти ссылки на объект?

7
задан Silent Warrior 12 June 2010 в 05:46
поделиться

4 ответа

В конечном счете, каждый объект Java знает свой класс и может иметь примитив синхронизации, необязательно присоединенный к нему (хотя this может быть синтетическим). Это две ссылки, без которых трудно сделать экземпляр java.lang.Object . Все остальное является производным от этого класса, поэтому у вас есть минимальный уровень затрат, который в Java 1.3.1 составил не менее 8 байт. Профайлер сообщит вам текущие расходы, если они вам действительно нужны.

6
ответ дан 6 December 2019 в 14:00
поделиться

Да, это так, потому что как минимум даже «пустой» объект имеет указатель на информацию о своем типе.

4
ответ дан 6 December 2019 в 14:00
поделиться

Тестирование памяти затруднено из-за различных источников помех (растущая куча, 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

2
ответ дан 6 December 2019 в 14:00
поделиться

Давайте внесем ясность. Ссылки на ваш объект, конечно, будут занимать место. Но ваш объект также займет место для своего указателя 'this' (т.е. для того, чтобы вы могли различать разные экземпляры), а также для полей любых суперклассов - например, Object - и, наконец, для любых накладных расходов на внутренние структуры данных кучи.

3
ответ дан 6 December 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: