Мое понимание загрузки классов состояло в том, что класс загружается, когда он в первую очередь необходим (чтобы сделать его очень простым). Запуск следующего образца с -verbose: класс и модифицированную версию класса Итераторов, который печатает сообщение, когда его clinit называется я заметил что-то, что я не могу объяснить, хотя:Загрузка, связывание и инициализация. Когда класс загружается?
public class IteratorsTest
{
public static void main(String[] args)
{
com.google.common.collect.Iterators.forArray(1, 2, 3);
}
}
The (очищено вверх) выход следующий:
[Loaded com.google.common.collect.Iterators from file:...]
[Loaded com.google.common.collect.Iterators$1 from file:...]
---------> Iterators <clinit>
Почему Итераторы $ 1 загружены до того, как климат называется? Он определен только в клинике, не так ли?
static final UnmodifiableListIterator<Object> EMPTY_LIST_ITERATOR =
new UnmodifiableListIterator<Object>() {
...
}
Какие результаты в следующем байт-код:
static <clinit>()V
L0
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
LDC "---------> Iterators clinit --------------"**
INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
L1
NEW com/google/common/collect/Iterators$1
DUP
INVOKESPECIAL com/google/common/collect/Iterators$1.<init>()V
L2
PUTSTATIC com/google/common/collect/Iterators.EMPTY_LIST_ITERATOR : Lcom/google/common/collect/UnmodifiableListIterator;
И запутать меня еще больше у меня есть еще один образец (слишком сложен, чтобы разместить здесь), где та же строка кода, как и в основной выше, приводит к следующему выходу:
[Loaded com.google.common.collect.Iterators from file:...]
---------> Iterators <clinit>
[Loaded com.google.common.collect.Iterators$1 from file:...]
Это на самом деле то, чего я ожидал от простой тестовой программы.
Я попытался найти ответ здесь https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html, но это действительно не помогло.
- Что может быть причиной того, что иногда климат выполняется первым, а иногда и первым загружается анонимный класс?
- Есть ли способ отслеживать, когда JVM вызывает климат классов? что-то похожее на -verbose: class или -XX: + TraceClassLoading и т. д.?
Новая инфраструктура регистрации openjdk9 позволяет довольно мелкомасштабную разбивку множества внутренних компонентов, включая загрузку и инициализацию классов. возможно, это предоставит необходимую вам информацию. – the8472
Хорошо, я читал о новых функциях регистрации, но еще не пробовал их. Возможно, стоит сделать пробный прогон. Благодаря! –
Хотя я нашел это, я хотел знать, помог бы JDK9, и да, действительно, это выполнило бы эту работу. Я начал с -Xlog: class + init = info, class + load = info: file = trace.log (btw: есть ли где-нибудь полный список доступных селекторов? Что здесь представлено http://openjdk.java.net/ jeps/158 на самом деле недостаточно). PS: это был ваш комментарий здесь http://stackoverflow.com/questions/39321345/how-do-measure-jvm-startup-time, где я читал об этом в первую очередь. –