Страницы

Поиск по вопросам

четверг, 5 декабря 2019 г.

Зачем в jvm нужны строковые константы?

#java #компиляция #jvm #виртуальная_машина


Пишу небольшую jvm (не очень строго соблюдая спецификацию) и компилятор под это дело.
Столкнулся с таким вот вопросом. По спецификации в пуле констант class файла, имеет
место быть константа типа Utf8, служащая как я понял для представления строк. Мне не
совсем понятно, для чего она нужна, так как у меня имеется следующая цепочка рассуждений.

В jvm нет строк, их можно представить только как int[]. Для того что бы конечный
пользователь не возился с массивами, был сделан класс String, который на вход принимает
как раз этот int[] (на уровне java это char[]). А выражение вида:

String str = "abc";


Разворачивается компилятором таким образом:

char[3] t;
t[0] = 'a';
t[1] = 'b';
t[2] = 'c';
String str = new String(t);


Те строка так же оказывается пуле констант, но уже как константы типа int (так как
char c utf символом разворачивается в short, а все short на уровне вм это int, а любой
int > 127 попадает в пул констант (до 127 заносится в стек напрямую через инструкцию
bipush)).

Вопрос - зачем нужны константы utf8 (вероятно я неправильно понимаю механику работы
строк?)?

P. S. При этом если использовать занесение строк в пул констант как я написал, то
получается просто сумасшедшая экономя места, так как для строки например из 1000 кириллических
символов, придется выделить 2кб памяти в пуле констант, а для хранения их как int,
всего 2 * 4 * кол-во одинаковых символов в строке. Т. е. если например используются
только буквы русского алфавита, вся строка займет в пуле всего 66 байт.
    


Ответы

Ответ 1



Ну я как обычно задал вопрос а потом сам разобрался. Строковые константы utf8 необходимы для хранения различной мета-информации, необходимой jvm для функционирования. В пример можно привести работу инструкции new, которая в качестве аргумента, получает адрес в пуле констант, на котором хранится строковая константа с сигнатурой класса. Например для : new String(); компилятор сгенерирует инструкцию new, аргумент которой будет ссылаться на ячейку пула констант типа utf8 с содержимым - java/lang/String.

Ответ 2



В скомпилированном class-файле нет понятия строковой константы. Возможно, вы имели в виду пул констант. Согласно спецификации Java 7: 4.4. Пул констант Инструкции в виртуальной машине Java не полагаются на строение классов, интерфейсов, экземпляров классов и массивов. Вместо этого они указывают на записи в таблице constant_pool. 4.4. The Constant Pool Java Virtual Machine instructions do not rely on the run-time layout of classes, interfaces, class instances, or arrays. Instead, instructions refer to symbolic information in the constant_pool table. То есть он хранит не только строки и метаинформацию, а вообще всё, что должно быть размещено в пямяти (а не прямо по месту вызова).

Комментариев нет:

Отправить комментарий