Может ли JVM оптимизировать память, необходимую для ссылок на нуль, экземпляр нулевого типа? - PullRequest
0 голосов
/ 30 января 2012

Добрый день всем,

У меня есть класс, который выглядит так:

public class Grapheme {
    public Grapheme(int[] code_points) {
        this.code_points = code_points;
    }
    int[] code_points;
}

Из ссылки , предоставленной bdonlan ниже , я понимаю, что обычно для объекта Grapheme требуется 8 байтов для заголовка объекта, 4 байта для переменной code_points (тип которой равен ссылка ) и 4 байта заполнения.

Поэтому, если я создаю экземпляр Grapheme с использованием кода new Grapheme(null), для этого экземпляра Grapheme обычно требуется 16 байтов. Поскольку то, является ли это 16 байтами, зависит от реализации, с этого момента я буду ссылаться на это число как x байтов.

В основном мне было интересно, если я создам n число графем, передавая null в конструктор Grapheme(int[]) для всех из них, и сохраню эти графемы в массиве длиной n

Будет ли общая память, необходимая для выполнения (для хранения экземпляров Grapheme), строго n * x байт?

Или есть какой-либо шанс , что JVM может попытаться выполнить некоторые магические оптимизации, чтобы требуемая память была ниже n * x байтов?

1 Ответ

2 голосов
/ 30 января 2012

Нет. Размер объекта фиксирован. Подумайте - если JVM упаковала ваши графемы в массив без пробелов между ними, что произойдет, если какой-то код изменит значение code_points позже? Нужно переместить все остальные графемы и переписать любые указатели на любой из них. Это будет ОГРОМНОЕ снижение производительности (вам, вероятно, потребуется выполнить полный сборщик мусора, чтобы переписать все эти указатели ...), и это будет совершенно непостижимо для программиста, пытающегося выяснить, почему простое назначение было таким медленным. Таким образом, JVM не выполняет оптимизацию такого рода.

Также обратите внимание, что ваши накладные расходы немного отличаются. Согласно этой странице , объекты имеют служебные данные в 8 байтов, плюс пространство для любых внутренних полей, для 12 байтов. Затем он округляется до кратного 8 байт, поэтому ваш объект Grapheme здесь будет иметь в общей сложности 16 байт на 32-разрядной платформе и в JVM Hotspot. Любые указатели на объект Grapheme займут дополнительное пространство (вероятно, 4 байта каждый). Объекты не нуждаются в пространстве для своего собственного адреса как такового; эта память принадлежит другому объекту (например, стеку или другому объекту).

...