Фреймы стека Java для методов без явных вызовов (сайты вызовов) - PullRequest
0 голосов
/ 14 апреля 2019

У меня есть вопрос относительно методов, которые появляются в стеке при выполнении Java-программы. Я инструктировал код для регистрации, когда запуск метода и когда метод завершается (подумайте о AOP до и после). Я создаю журнал для каждой темы. Результаты в основном такие, как ожидалось, с небольшими различиями.

  1. При обнаружении отражающего вызова регистрируется не только java.lang.reflect.Method#invoke, но и дополнительные вызовы, такие как sun.reflect.DelegatingMethodAccessorImpl#invoke. Я предполагаю, что это связано со скрытыми фреймами, обсуждаемыми в документации StackWalker .
  2. Существуют дополнительные вызовы, в основном java.lang.ClassLoader.loadClass, но также sun.instrument.InstrumentationImpl.transform (помните, я прибавляю код!). Это методы, у которых есть стековые фреймы, но в классах приложения нет сайтов вызовов.

У меня два вопроса:

  1. Есть ли список всех методов или критерий, определяющий методы, для которых вызовы будут скрыты (например, "все методы, определенные в классах в пакетах, начинающихся с sun.)?
  2. Есть ли список всех методов или критерий, определяющий методы, которые вызываются JVM без места вызова в коде пользователя?

Спасибо

1 Ответ

1 голос
/ 17 апреля 2019
  1. В sun.reflect.DelegatingMethodAccessorImpl#invoke и его друзьях нет ничего особенного.Это обычные методы Java, которые имеют обычный сайт вызова в коде Java.

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

    Найдите в исходном коде HotSpot JavaCalls::call_virtual, JavaCalls::call_static, JavaCalls::call_special и т. Д.Например, здесь является вызовом упомянутого ClassLoader.loadClass.

    На самом деле, любой метод может быть вызван таким способом.Даже если вам удастся получить полный список, он не будет очень полезен, поскольку он может измениться в любом незначительном обновлении JDK.

    Кроме того, пользовательский код и библиотеки агентов также могут вызывать любой метод Java с использованием JNI,и эти вызовы также не будут иметь видимого сайта вызовов Java.

...