Obsługuję aplikację do obsługi wiadomości Java, która wymaga małego opóźnienia (< 300 mikrosekund przetwarzających każdą wiadomość). Jednak nasze profilowanie pokazuje, że wirtualna maszyna Sun Java działa początkowo i przyspiesza po pierwszych 5000 wiadomościach. Pierwsze 5000 wiadomości ma opóźnienie 1-4 milisekund. Po około pierwszych 5 000 kolejnych komunikatów opóźnienie wynosi ~ 250 mikrosekund, z sporadycznymi wartościami odstającymi.Technika lub narzędzie minimalizujące czas rozgrzewki Java?
Powszechnie wiadomo, że jest to typowe zachowanie aplikacji Java. Z biznesowego punktu widzenia nie można jednak powiedzieć klientowi, że musi poczekać, aż JVM się "rozgrzeje", zanim zobaczą wymaganą wydajność. Aplikacja musi być „podgrzewana” przed pierwszym komunikacie klienta są przetwarzane
JVM jest Sun 1.6.0 Aktualizacja 4.
Pomysły na przezwyciężenie tego problemu:
- ustawienia JVM, takie jak -XX: CompileThreshold =
- Dodaj komponent do "rozgrzewania" aplikacji podczas uruchamiania, na przykład wysyłając "fałszywe wiadomości" za pośrednictwem aplikacji.
- Statyczne ładowanie aplikacji i klas JDK podczas uruchamiania aplikacji, aby klasy nie były ładowane z plików JAR podczas przetwarzania komunikatów klienta.
- Niektóre narzędzia lub agent Java, który realizuje jedną lub obie powyższe dwie koncepcje, dzięki czemu nie muszę ponownie wymyślać koła.
UWAGA: Oczywiście dla tego rozwiązania sprawdzam wszystkie czynniki, w tym łuk, typ i konfigurację dysku oraz ustawienia systemu operacyjnego. Jednak na to pytanie chcę się skupić na tym, co można zrobić, aby zoptymalizować aplikację Java i zminimalizować czas "rozgrzewki".
Myślę, że lepiej przyjrzeć się podstawowej przyczynie początkowego opóźnienia. Narzędzia profilujące mogą pomóc. – Thomas
Wysyła 5000 fałszywych wiadomości do serwera w ramach procedury instalacji i uruchamiania. – Zed
5000 fałszywych wiadomości (nawet jeśli to był dobry pomysł) brzmi, jakby dodać 5 do 20 sekund do czasu uruchomienia aplikacji. –