Maszyna wirtualna Javy pozwala na ustawienie wielu różnych parametrów podczas uruchamiania, które moją wpływ na jej działanie. Pozwalają one m.in. na optymalizację pracy GC czy też związane z wielkością zajmowanej pamięci.

Jednym z parametrów jest AggressiveOpts, który pozwala na włączenie różnych parametrów optymalizacyjnych, które mogą zostać włączone w kolejnym wydaniu JVM. Warto jednak pamiętać, że wraz z każdym wydanie JVM lista tych opcji może się zmienć a ciężko znaleźć informację, jakie parametry są aktualnie używane.

Z pomocą tutaj przychodzą dwie opcje JVM:

  • PrintFlagsFinal – pozwala ona na wyświetlenie wartości wszystkich dopuszczalnych opcji
  • UnlockDiagnosticVMOptions – daje dostęp do dodatkowych opcji konfiguracyjnych

I tak listę wszystkich parametrów wraz z ich wartościami można obejrzeć przy pomocy polecenia:

java -XX:+PrintFlagsFinal -XX:+UnlockDiagnosticVMOptions -version

A lista dla włączonej optymalizacji AggressiveOpts:

java -XX:+AggressiveOpts -XX:+PrintFlagsFinal -XX:+UnlockDiagnosticVMOptions -version

Lista jest dosyć spora, więc prościej będzie zobaczyć po prostu różnice pomiędzy uruchomieniem JVM z i bez parametru AggressiveOpts:

diff <(java -XX:+PrintFlagsFinal -XX:+UnlockDiagnosticVMOptions -version ) \
   <(java -XX:+AggressiveOpts -XX:+PrintFlagsFinal -XX:+UnlockDiagnosticVMOptions -version )

W wersji JVM 1.6.26 wyświetli listę 6 różnych opcji, których ustawienie się różni. Łatwo także sprawdzić, czym się różni uruchomienie JVM z parametrem server oraz bez.

Dla ułatwienia analizy różnic, zamiast polecenia diff można użyć np. vimdiff:

vimdiff <(java -XX:+PrintFlagsFinal -XX:+UnlockDiagnosticVMOptions -version ) \
   <(java -XX:+AggressiveOpts -XX:+PrintFlagsFinal -XX:+UnlockDiagnosticVMOptions -version )

Źródła