Есть ли способ сказать, какой алгоритм GC использует JVM в настоящее время? - PullRequest
6 голосов
/ 15 февраля 2012

Я использую Java 5, и наше пользовательское серверное приложение нуждается в настройке GC, так как иногда мы наблюдаем 15-20 секундную паузу в часы пик. Мы запускаем Java 5 на компьютере серверного класса с аргументами JVM, такими как -server -d64

Есть ли способ узнать, какой алгоритм GC использует JVM в настоящее время?

http://docs.oracle.com/javase/1.5.0/docs/guide/vm/gc-ergonomics.html

На машинах серверного класса, на которых запущена виртуальная машина сервера, сборщик мусора (GC) изменился с предыдущего последовательного сборщика (-XX:+UseSerialGC) на параллельный сборщик (-XX:+UseParallelGC). Вы можете переопределить это значение по умолчанию, используя параметр командной строки -XX:+UseSerialGC для команды java.

1) Я хочу знать, это действительно происходит?

мой следующий вопрос Я добавил следующее в аргументах командной строки

-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -Xloggc:logs/gc.log

2) окажут ли они какое-либо влияние на производительность или поведение на работающей JVM, кроме записи журналов GC?

Ответы [ 5 ]

5 голосов
/ 16 октября 2012

вы можете использовать -XX: + PrintFlagsFinal для распечатки параметров JVM и их настроек.

java -XX: + PrintFlagsFinal -server -version

2 голосов
/ 10 января 2017

Вы можете использовать jmap -heap <jvm_pid>, чтобы распечатать сводку кучи Java.Например, сводка кучи Intellij выглядит следующим образом, если я запускаю jmap -heap 2592:

Присоединение к идентификатору процесса 2592, пожалуйста, подождите ...
Отладчик успешно подключен.
Компилятор сервераобнаружена.
Версия JVM: 25.101-b13

с использованием параллельных потоков в новом поколении.
с использованием локального объекта потока.
Concurrent Mark-Sweep GC
Усеченный ...

Как вы можете заметить по выходным данным, экземпляр JVM, работающий с идентификатором процесса 2592, использует CMS GC алгоритм.

Кроме того, если алгоритм был определен этими -XX:+Use*GC флагами, вы можете найти это, используя jcmd <pid> VM.flags.Например:

$ jcmd 2715 VM.flags 
2715:
-XX:CICompilerCount=4 -XX:InitialHeapSize=268435456
-XX:MaxHeapSize=734003200 -XX:MaxNewSize=244318208 
-XX:MinHeapDeltaBytes=524288 -XX:NewSize=89128960 -XX:OldSize=179306496 
-XX:+UseCompressedClassPointers -XX:+UseCompressedOops 
-XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC 

Как видите, виртуальная машина использует Parallel GC .

1 голос
/ 15 февраля 2012

Вы можете получить текущие значения gc, используя GarbageCollectorMXBeans .

И в значительной степени все протоколирование влияет на производительность.

1 голос
/ 15 февраля 2012

Подключите Visual VM к вашему процессу и проверьте mbeans.Если вы никогда не использовали его раньше (это часть загрузки Oracle JDK), вам, вероятно, придется установить плагин MBean (что легко)

http://docs.oracle.com/javase/6/docs/technotes/guides/visualvm/

http://visualvm.java.net/mbeans_tab.html

0 голосов
/ 15 февраля 2012

Если GC становится проблемой, я бы порекомендовал вам взглянуть на Java RTS (система реального времени) .

Java RTS позволяет получить точный контроль над работой GC. Это означает, что у вас есть полный контроль над сценарием наихудшего случая и, следовательно, вы можете имитировать, как ваша система будет работать в условиях стресса.

...