Когда вызывается метод checkPackageAccess ClassLoader

Я хотел бы понять, когда JVM вызывает метод checkPackageAccess ClassLoader. Из javadoc я прочитал, что он вызывается JVM после загрузки класса с загрузчиком классов. Но я обнаружил, что иногда он вызывается более одного раза после loadclass. На каком основании JVM решает это назвать. Буду очень признателен, если кто-то сможет уточнить метод.

Чтобы было легче понять, вот что я сделал:

  1. Я запускаю одну и ту же программу дважды. Оба раза с -noverify
  2. В одном прогоне я удаляю <clinit> из классов, в другой не беги.

Бег с <clinit> выглядит так: беги с клинитом

Один без так: беги без клинита

Так что, как вы видите, прогон без клиник приводит к трем checkPackageAccess после java.sql.DriverPropertyInfo был загружен в то время как нормальный запуск (с Clinit) приводит только к одному. Поскольку в обоих случаях <clinit> (ни оригинальный, ни пустой во втором прогоне) еще не реализован. Интересно, что заставляет JVM выполнить это? checkPackageAccess вызов.

  • Первый checkPackageAccess для java.sql.DriverPropertyInfo
    оба бега)
  • Второй для java.util.concurrent.ConcurrentHashMap
  • Третий для java.lang.ref.ReferenceQueue

Я использую JVMTI methodEntry и methodExit события, чтобы генерировать след всего, что происходит. Тем не менее я не могу объяснить, что приводит к этим дополнительным checkPackageAccess звонки.

0 ответов

Другие вопросы по тегам