Co musi zrobić JVM podczas wywoływania natywnej metody?
Jakie są typowe kroki, które środowisko uruchomieniowe JVM musi wykonać podczas wywoływania metody Java zadeklarowanej jako native
?
Jak HotSpot 1.8.0 JVM implementuje wywołanie funkcji JNI? Jakie są kroki kontrolne (np. nieobsługiwane wyjątki po powrocie?), jaką księgowość ma wykonać JVM (np. lokalny rejestr referencyjny?), a gdzie po wywołaniu natywnej metody Javy przebiega kontrolka? Byłbym również wdzięczny, gdyby ktoś mógł podać wpis wskaż lub ważne metody z natywnego kodu HotSpot 1.8.0.
Disclaimer: wiem, że sam mogę przeczytać kod, ale wcześniejsze wyjaśnienie pomaga w szybkim znalezieniu drogi przez kod. Dodatkowo uważam, że to pytanie warto przeszukiwać w Google. ;)
1 answers
Wywołanie metody JNI z Javy jest dość kosztowne w porównaniu z prostym wywołaniem funkcji C. HotSpot zazwyczaj wykonuje większość następujących kroków, aby wywołać metodę JNI:
- utwórz ramkę stosu.
- przenoszenie argumentów do odpowiednich lokalizacji rejestru lub stosu zgodnie z ABI.
- Zawijanie odniesień do obiektów do uchwytów JNI.
- uzyskać
JNIEnv*
ijclass
dla metod statycznych i przekazać je jako dodatkowe argumenty. - sprawdź, czy należy wywołać
method_entry
trace funkcja. - blokuje Monitor obiektu, jeśli metoda jest
synchronized
. - sprawdź, czy natywna funkcja jest już połączona. Wyszukiwanie funkcji i łączenie odbywa się leniwie.
- Przełącz wątek ze stanu
in_java
na stanin_native
. - wywołanie funkcji natywnej
- sprawdź, czy safepoint jest potrzebny.
- Return thread to
in_java
state. - Odblokuj monitor, jeśli jest zablokowany. / Align = "left" /
- Rozpakuj wynik obiektu i zresetuj uchwyty JNI blok.
- Obsługa wyjątków JNI.
- Usuń ramkę stosu.
Kod źródłowy tej procedury można znaleźć pod adresem SharedRuntime::generate_native_wrapper .
Jak widzisz, napowietrzność może być znacząca. Ale w wielu przypadkach większość z powyższych kroków nie jest konieczna. Na przykład, jeśli natywna metoda wykonuje kodowanie/dekodowanie na tablicy bajtów i nie wyrzuca żadnych WYJĄTKÓW ani nie wywołuje innych funkcji JNI. W takich przypadkach HotSpot ma niestandardową (i nieznaną) Konwencję o nazwie Critical Natives
, omówioną tutaj.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-07 21:58:23