При выполнении Java 1.6 (1.6.0_03-b05) приложение я добавил -XX:+PrintCompilation
флаг. На выводе для некоторых методов в особенности некоторые из тех, которых я знаю, становятся названными много, я вижу текст made not entrant
и made zombie
.
Что они означают? Лучшее предположение - то, что это - шаг декомпиляции прежде, чем перекомпилировать или тот метод или зависимость с большей оптимизацией. Это верно? Почему "зомби" и "участник"?
Пример, с довольно мало времени между некоторыми из этих строк:
[... near the beginning]
42 jsr166y.LinkedTransferQueue::xfer (294 bytes)
[... much later]
42 made not entrant jsr166y.LinkedTransferQueue::xfer (294 bytes)
--- n sun.misc.Unsafe::compareAndSwapObject
170 jsr166y.LinkedTransferQueue::xfer (294 bytes)
170 made not entrant jsr166y.LinkedTransferQueue::xfer (294 bytes)
4% jsr166y.LinkedTransferQueue::xfer @ 29 (294 bytes)
171 jsr166y.LinkedTransferQueue::xfer (294 bytes)
[... even later]
42 made zombie jsr166y.LinkedTransferQueue::xfer (294 bytes)
170 made zombie jsr166y.LinkedTransferQueue::xfer (294 bytes)
171 made not entrant jsr166y.LinkedTransferQueue::xfer (294 bytes)
172 jsr166y.LinkedTransferQueue::xfer (294 bytes)
[... no further logs]
Это абсолютно не моя область знаний, но мне было интересно, и я немного покопался.
Пара ссылок, которые могут показаться вам интересными: OpenJDK:nmethod.cpp, OpenJDK:nmethod.hpp.
Выдержка из nmethod.hpp
:
// Make the nmethod non entrant. The nmethod will continue to be
// alive. It is used when an uncommon trap happens. Returns true
// if this thread changed the state of the nmethod or false if
// another thread performed the transition.
bool make_not_entrant() { return make_not_entrant_or_zombie(not_entrant); }
//...
Просто как отправная точка.