Использование -noverify при запуске Java-приложений

StackOverflow https://stackoverflow.com/questions/300639

  •  08-07-2019
  •  | 
  •  

Вопрос

Я видел много приложений, в которых проводятся занятия по инструментам и -javaagent в качестве параметра при загрузке также поместите -noverify в командную строку.

Документ Java говорит, что -noverify отключает проверку класса.

Однако зачем кому-то отключать проверку, даже если они инструментируют классы?

Это было полезно?

Решение

Время запуска, я бы сказал. Проверка правильности классов занимает некоторое время, когда класс загружается. Поскольку классы могут загружаться лениво (не при запуске приложения, а при первом использовании), это может привести к неожиданным и нежелательным задержкам выполнения.

На самом деле класс вообще не нужно проверять. Компилятор не будет выдавать какой-либо недопустимый байт-код или конструкцию класса. Причина проверки заключается в том, что класс может быть построен на одной системе, размещаться в Интернете и передаваться вам через незащищенный Интернет. На этом пути злоумышленник может изменить байт-код и создать то, что компилятор может никогда не создать; что-то, что может привести к сбою JVM или, возможно, обойти ограничения безопасности. Таким образом, класс проверяется перед использованием. Если это локальное приложение, обычно нет необходимости снова проверять байт-код.

Другие советы

Когда он используется вместе с -javaagent , он, скорее всего, не по соображениям производительности, а потому, что агент намеренно создает " неверный " байткод.

Следует отметить, что недействительный байт-код может все еще выполняться нормально, потому что некоторые из правил проверки являются довольно строгими. Например, this не должен быть доступен в конструкторе до вызова супер-конструктора, потому что переменные не инициализируются в этой точке. Но могут быть и другие вещи, которые вы хотите сделать (см. Пример JRebel). Затем вы используете -noverify , чтобы обойти это правило.

Отладка!На самом деле это то, что я делаю сейчас, и как я наткнулся на этот вопрос.В Terracotta мы много занимаемся инструментированием байт-кода, и иногда помогает отключить верификатор во время отладки адаптеров классов, чтобы мы могли видеть, где именно они терпят неудачу во время выполнения.

Вы правы, мы хотим, чтобы верификатор продолжал работать.

Использование JRebel без -noverify выдаст это предупреждение при запуске:

  

JRebel: '-noverify' отсутствует, изменение / добавление / удаление конструкторов не будет включено!

Похоже, что -noverify позволяет повторному инструментированию байт-кода выполнять некоторые действия, которые в противном случае были бы невозможны.

Время запуска раньше было проблемой. Однако верификаторы теперь быстрее, как и процессоры. Код, скомпилированный с JDK6, по умолчанию будет включать в себя дополнительную информацию, чтобы сделать шаг проверки быстрее. Apache Harmony просто использует гораздо более быстрый алгоритм проверки.

Некоторые очень старые версии javac выдают неправильный байт-код. Действительно, подключаемый модуль Sun по-прежнему содержит исправляющий код для проверки некоторых поврежденных файлов классов.

Новый верификатор, представленный в JAVA 6, очень сложен для обработки манипуляций с кодом.

Взгляните на это: http: // chrononsystems .com / блог / Java-7-дизайн-дефектоскопии приводит-к-огромный-обратно шаг для-JVM

и соответствующий отчет об ошибке: http://bugs.sun.com/view_bug.do?bug_id=8009595

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top