Spec-Zone .ru
спецификации, руководства, описания, API
Содержание | Предыдущий | Следующий | ИндексСпецификация Виртуальной машины JavaTM


ГЛАВА 9

Оптимизация


Эта глава описывает оптимизацию, реализованную в версии Sun виртуальной машины Java. В этой оптимизации скомпилированный код виртуальной машины Java изменяется во время выполнения для лучшей производительности.

Оптимизация принимает форму ряда псевдоинструкций. Они - разновидности нормальных инструкций виртуальной машины Java, которые используют в своих интересах информацию, изученную во время выполнения, чтобы сделать меньше работы чем исходные инструкции. Псевдоинструкции различимы суффиксом _quick в их мнемонике.

Важно понять, что эти псевдоинструкции не являются частью спецификации виртуальной машины Java или набора команд. Они невидимы за пределами реализации виртуальной машины Java. Однако, в реализации виртуальной машины Java они, оказалось, были эффективной оптимизацией.

Метод, задокументированный в эту главу, покрывается американскими Доступными 5 367 685.


9.1 Динамическое подключение через Перезапись

Предназначение компилятора виртуальная машина Java должно только испустить инструкции от набора команд, задокументированного в Главу 6, "Набор команд виртуальной машины Java." Оптимизация, описанная в этой главе, работает, динамически заменяя возникновения определенных из тех инструкций, в первый раз, когда они выполняются внутренними, более эффективными разновидностями. Новые инструкции используют в своих интересах загрузку и соединение работы, сделанной в первый раз, когда связанная нормальная инструкция выполняется.

Для инструкций, которые переписываются, каждый экземпляр инструкции заменяется на ее первом выполнении _quick псевдоинструкцией. Последующее выполнение того экземпляра инструкции всегда является _quick разновидностью. У большинства инструкций с _quick разновидностями есть только единственная альтернативная версия, хотя у некоторых есть несколько.

Во всех случаях инструкции с _quick разновидностями ссылаются на постоянный пул, довольно дорогостоящую работу. _quick псевдоинструкции экономят время, используя факт, что, в то время как в первый раз инструкция, ссылающаяся на постоянный пул, должна динамически разрешить постоянную запись пула, последующие вызовы той же самой инструкции должны сослаться на тот же самый объект и не должны разрешить запись снова. Процесс перезаписи следующие:

  1. Разрешите указанный элемент в постоянном пуле.
  2. Выдайте исключение, если элемент в постоянном пуле не может быть разрешен.
  3. Перезапишите инструкцию с _quick псевдоинструкцией и любыми новыми операндами, которых это требует. Инструкции putstatic, getstatic, putfield, и getfield у каждого есть две _quick версии, выбранные в зависимости от типа поля, управляемого на.
  4. Выполните новую _quick псевдоинструкцию.
Это - то же самое как определение исходной инструкции, за исключением дополнительного шага, в котором инструкция перезаписывает себя со своей _quick разновидностью. Операнды _quick псевдоинструкции должны соответствовать в пределах места, выделенного для операндов исходной инструкции.

_quick разновидность инструкции может предположить, что элемент в постоянном пуле был уже разрешен и что это разрешение не генерировало ошибок. Это просто выполняет намеченную работу на разрешенном элементе. Существенное количество времени таким образом сохраняется на всех последующих вызовах псевдоинструкции.


9.2 _quick Псевдоинструкции

Остаток от этой главы определяет _quick псевдоинструкции, используемые реализацией виртуальной машины Java Sun. Хотя они документируются в тот же самый формат как нормальные инструкции виртуальной машины Java, _quick псевдо - инструкции не являются частью спецификации виртуальной машины Java и не появляются в class файлы. Они обычно - невидимая деталь реализации, так, чтобы решения, такие как варианты кода операции оставили до конструктора.

Однако, есть исключения к этому правилу. Определенные инструменты, такие как отладчики и своевременный (JIT), генераторы кода, возможно, должны знать детали о _quick псевдоинструкциях так, чтобы они могли работать на коде, который был уже выполнен. Реализация виртуальной машины Java может использовать методы, подобные, но отличающийся от _quick псевдоинструкций Sun, или может использовать различные числа кода операции от реализации Sun. Инструменты, принимающие детали _quick псевдоинструкций Sun, возможно, не работают с этими отличающимися реализациями.

API разрабатываются для генераторов кода JIT и отладчиков. Эти API могут обеспечить способы скрыть детали внутренних псевдоинструкций так, чтобы инструменты, которые независимы от внутренних деталей реализации, могли быть записаны. Однако, с этой записи этих API еще не были установлены, так тем временем мы документируем значения кода операции вместе с другими деталями _quick инструкций Sun. Инструменты могут предположить, что реализации виртуальной машины Java, которые происходят из Sun, или которые пишутся, чтобы быть совместимыми с реализацией Sun, будут следовать за спецификацией, данной ниже.

Связаться jvm@java.sun.com для получения дополнительной информации о состоянии отладчика и API генератора кода JIT.



Содержание | Предыдущий | Следующий | Индекс

Спецификация Виртуальной машины Java

Авторское право © 1996, 1997 Sun Microsystems, Inc. Все права защищены
Пожалуйста, отправьте любые комментарии или исправления к jvm@java.sun.com

free hit counter