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. ;)

Author: box, 2014-07-14

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:

  1. utwórz ramkę stosu.
  2. przenoszenie argumentów do odpowiednich lokalizacji rejestru lub stosu zgodnie z ABI.
  3. Zawijanie odniesień do obiektów do uchwytów JNI.
  4. uzyskać JNIEnv* i jclass dla metod statycznych i przekazać je jako dodatkowe argumenty.
  5. sprawdź, czy należy wywołać method_entry trace funkcja.
  6. blokuje Monitor obiektu, jeśli metoda jest synchronized.
  7. sprawdź, czy natywna funkcja jest już połączona. Wyszukiwanie funkcji i łączenie odbywa się leniwie.
  8. Przełącz wątek ze stanu in_java na stan in_native.
  9. wywołanie funkcji natywnej
  10. sprawdź, czy safepoint jest potrzebny.
  11. Return thread to in_java state.
  12. Odblokuj monitor, jeśli jest zablokowany.
  13. / Align = "left" /
  14. Rozpakuj wynik obiektu i zresetuj uchwyty JNI blok.
  15. Obsługa wyjątków JNI.
  16. 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.

 39
Author: apangin,
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