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

205
13 сентября 2017, 11:41

Пишу небольшую 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 байт.

Answer 1

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

new String();

компилятор сгенерирует инструкцию new, аргумент которой будет ссылаться на ячейку пула констант типа utf8 с содержимым - java/lang/String.

READ ALSO
Наложение цвета на изображение

Наложение цвета на изображение

Привет всем, в матане не силён нужна помощь

260
Тень текста самим текстом

Тень текста самим текстом

Добрый вечер! Нужно сделать то, что на картинкеТень текста самим текстом

218
Нужен плагин адаптивного календаря [требует правки]

Нужен плагин адаптивного календаря [требует правки]

Мне нужно реализовать такой функционал, есть ли готовые решения/плагины? :

220
Выравнивание по центру css

Выравнивание по центру css

Блок обведённый в красную рамку фиксированный position: fixed;, необходимо его каким-нибудь образом выровнять вертикально по центруВысота самого...

232