46181 (762242), страница 2
Текст из файла (страница 2)
Верификатор байт-кода - неотъемлемая часть JVM, он проверяет каждую выполняемую инструкцию виртуальной машины (в том числе и добавленную динамически) для предотвращения поступления заведомо некорректной информации. Считается, что верификатор предотвращает следующие операции:
- подделка указателей, например, получение указателя как результат выполнения арифметической операции (хотя инструкции getLong/putLong позволяют обращаться к любой ячейке памяти и верификатор им не помеха);
- нарушение прав доступа к компонентам классов, в частности, присваивание переменной, снабженной описателем final (инструкции gettong/putLong без труда обходят это ограничение);
- использование объектов в каком-либо другом качестве, например, применение к объекту метода другого класса (инструкции getLong/putLong позволяют обойти систему контроля типов). Фактически, верификатор решает более скромные задачи, препятствуя:
- вызову методов объектов с недопустимым набором параметров;
- вызову инструкций JVM с недопустимым набором параметров;
- некорректной операции с JVM-регистрами;
- переполнению или исчерпанию стека. Для достижения максимальной производительности верификатор совершает ряд допущений, смягчая проверку «мертвого» кода (кода, который по мнению верификатора никогда не получит управление). А реализация верификатора в JIТ-компиляторах из динамической (выполняемой на каждом шаге) и вовсе вырождается в статическую (выполняемую до компиляции). В частности, проверка границ массивов, отнимающая много времени, опускается всякий раз, когда JIТ-компилятор считает, что нарушения доступа на данном участке кода заведомо не происходит. Сравнивая реализации JVM от Sun и Microsoft, нельзя не заметить, что реализация Microsoft работает существенно быстрее, а реализация Sun выполняет намного больше проверок. А реализация JVM корпорации IBM обеспечивает достаточно высокую производительность без существенного ущерба для безопасности.
Список литературы
IT спец № 07 ИЮЛЬ 2007