Podczas analizowania zrzutów sterty za pomocą jhat zaobserwowałem wiele instancji DelegatingClassLoader, mimo że nie zostały one wywołane jawnie w kodzie. Oczekuję, że będzie to jakiś mechanizm optymalizacji refleksji. Czy ktoś zna szczegóły?Co dla Sun JVM tworzy wystąpienia sun.reflect.DelegatingClassLoader w czasie wykonywania?
Odpowiedz
Tak, to prawdopodobnie optymalizacja odbicia.
W wirtualnej maszynie JVM początkowy dostęp do właściwości i metod jest wykonywany przez wywołanie przez JNI do implementacji JVM. Jeśli JVM zauważy, że dostęp do metody lub pola jest uzyskiwany przez dużą refleksję, wygeneruje kod bajtowy, aby zrobić to samo - mechanizm, który nazywa "inflacją". To ma początkową prędkość, ale po tym działa około 20 razy szybciej. Wielka wygrana, jeśli dużo się zastanowisz.
Ten bajt żyje w klasach utworzonych przez instancje DelegatingClassLoader. Miej oko na to: te klasy mogą wywierać presję na przestrzeni permen i powodować przerażające błędy "java.lang.OutOfMemoryError: PermGen space". Jeśli jest to problem, możesz wyłączyć inflację, ustawiając właściwość systemową sun.reflect.inflationThreshold na 0 (zero).
nie widzę (przynajmniej dla Hotspot), patrząc na kod
http://javasourcecode.org/html/open-source/jdk/jdk-6u23/sun/reflect/ReflectionFactory.java.html
i
że ustawienie zera spowoduje wyłączenie funkcji. Wydaje mi się, że tylko duża wartość dla sun.reflect.inflationThreshold wykona zadanie.
IBM zachowuje się inaczej, wyłączy je 0 lub 1. (Nie jestem pewien, czy robi coś innego dla 0 lub 1, ale z obydwoma nie widzę załadowania DelegatingClassLoader). – eckes
- 1. Zmienianie LD_LIBRARY_PATH w czasie wykonywania dla ctypów
- 2. Ładowanie XAML w czasie wykonywania?
- 3. Rozładowanie agenta JVMTI w czasie wykonywania?
- 4. Awaria OCMock w czasie wykonywania
- 5. metoda wywołania w czasie wykonywania
- 6. Powielanie składników w czasie wykonywania
- 7. Rejestrowanie metoda czasie wykonywania
- 8. Jak uzyskać preferencje dzwonka w czasie wykonywania?
- 9. Jak emitować i wykonywać kod bajtowy Java w czasie wykonywania?
- 10. Czy niezmienna metoda wyliczania może zostać zoptymalizowana przez maszynę JVM w czasie wykonywania?
- 11. W jaki sposób JVM wie, gdzie można złapać wyjątek w czasie wykonywania?
- 12. przełączanie słowników aplikacji wpf w czasie wykonywania
- 13. Narzędzia Java do łączenia wykonywania w czasie wykonywania z pokryciem
- 14. Rozszerzalność widoków ASP.NET MVC w czasie wykonywania
- 15. Przekształć typelistę z funkcją w czasie wykonywania
- 16. C++ Przypisywanie wartości stałej w czasie wykonywania?
- 17. TypeScript - Moduł jest niezdefiniowany w czasie wykonywania
- 18. Jak zmienić rozszerzenie pliku w czasie wykonywania
- 19. eval() nie przypisuje zmiennej w czasie wykonywania
- 20. Jquery Zapętlenie elementów utworzonych w czasie wykonywania
- 21. Lista zaćmienie zainstalowanych wtyczek w czasie wykonywania
- 22. Zamiana uruchomionego słoika w czasie wykonywania
- 23. & Klawisz skrótu nie znika w czasie wykonywania
- 24. Co tworzy! znaczy w szynach?
- 25. Zamek Windsor rozwiązuje w czasie wykonywania
- 26. Ładowanie 2 wersji zestawu w czasie wykonywania
- 27. Renderowanie obrazu w czasie wykonywania w WPF
- 28. Skompiluj rozszerzenie kodu C# w czasie wykonywania
- 29. Zmienianie wartości makra w czasie wykonywania
- 30. Zmienić ustawienia narodowe w czasie wykonywania?
Ostrzeżenie, właściwość działa na Oracle/OpenJDK i IBM JDK, jednak na IBM włącza inflację, na Sun natychmiast nadyma (próbowałem tego przy użyciu -verbose: klasa, która zwraca się w DelegatedClassLoaders w instancji, jako kod dla IBM jest niedostępne). Na obu wartości domyślnej jest 15, myślę o ustawieniu go na 1000 lub coś w celu zmniejszenia inflacji, ale nadal korzystać z przyspieszenia. – eckes