найти, какой тип сборщика мусора работает - PullRequest
57 голосов
/ 17 февраля 2011

Post JSE 5 эргономика предназначена для автоматического выбора подходящего типа сборщика мусора для вас (среди прочего).

Я хотел бы знать, есть ли способ подтвердить / узнать тип сборщика мусора и выбранные цели производительности / текущие, установленные эргономикой JVM.

Ответы [ 8 ]

61 голосов
/ 02 апреля 2012
java -XX:+PrintCommandLineFlags -version

покажет вам сборщик мусора по умолчанию.Я также нашел следующую страницу полезной, которая описывает сборщик мусора по умолчанию для различных операционных систем .

15 голосов
/ 07 ноября 2013
import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;
import java.util.List;

public class GCInformation {

    public static void main(String[] args) {
            try {
                    List<GarbageCollectorMXBean> gcMxBeans = ManagementFactory.getGarbageCollectorMXBeans();

                    for (GarbageCollectorMXBean gcMxBean : gcMxBeans) {
                            System.out.println(gcMxBean.getName());
                            System.out.println(gcMxBean.getObjectName());
                    }

            } catch (RuntimeException re) {
                    throw re;
            } catch (Exception exp) {
                    throw new RuntimeException(exp);
            }
    }
}

например. попробуйте следующие команды, чтобы узнать различные типы GC

java -XX:+PrintCommandLineFlags  GCInformation
java -XX:+PrintCommandLineFlags -XX:+UseParallelGC GCInformation
java -XX:+PrintCommandLineFlags -XX:+UseConcMarkSweepGC -XX:+UseParNewGC GCInformation
java -XX:+PrintCommandLineFlags -XX:+UseConcMarkSweepGC -XX:-UseParNewGC GCInformation
10 голосов
/ 03 марта 2011

Не прямой ответ на ваш вопрос, но я считаю, что это то, что вы ищете.

Согласно Java 6 документация 1 и 2 (не только Java 5):

Ссылка 1 говорит:

На машинах серверного класса, на которых запущена виртуальная машина сервера, сборщик мусора(GC) изменился с предыдущего последовательного [...] коллектора на параллельный коллектор

Ссылка 2 говорит:

Начиная с J2SE5.0, когда приложение запускается, программа запуска может попытаться определить, запущено ли приложение на компьютере «серверного класса», и, если это так, использовать виртуальную машину сервера Java HotSpot (серверная виртуальная машина) вместо виртуального клиента Java HotSpotМашина (клиентская виртуальная машина).

Также ссылка 2 гласит:

Примечание: для Java SE 6 определение серверного классакомпьютер имеет как минимум 2 процессора и минимум 2 ГБ физической памяти.

Из этой информацииВо-вторых, вы можете знать, что если сервер является сервером (согласно 2 ), то он будет использовать параллельный GC.Вы также можете сделать вывод, что он не изменит GC во время выполнения.

Возможно, вы найдете правильный ответ для несерверных компьютеров, если углубитесь в документацию.

9 голосов
/ 15 февраля 2017

(для Java <= 8 </strong>)

Эта команда выводит тип GC работающей JVM:

jmap -heap <pid> | grep GC

Для современного компьютера (несколько процессоров, большая память) JVM определит его как серверную машину и будет использовать Parallel GC по умолчанию, если вы не укажете, какой gc использовать через флаги JVM явно.

* 1015 например *

jmap -heap 26806 | grep GC

Выход:

Параллельный ГХ с 8 нитями


@ Обновление - для Java 9 +

(Спасибо @ JakeRobb комментарию.)

Начиная с Java 9, есть 2 изменения, относящиеся к этому вопросу:

  • Необходимо использовать jhsdb для подключения к процессу Java или запуска отладчика.
    См .: jhsdb
  • Значение по умолчанию для gc изменено на G1.

Формат команды:

jhsdb jmap --heap --pid <pid> | grep GC

* 1051 например *

jhsdb jmap --heap --pid 17573 | grep GC

Выход:

Сборщик мусора (G1) с 8 нитями

3 голосов
/ 19 мая 2016
-XX:+PrintGC
-XX:+PrintGCDetails

Это напечатает, какой GC используется. В моем случае это печатает:

[GC (Allocation Failure) [PSYoungGen: 348192K->32K(348672K)] 356792K->8632K(1048064K), 0.0111518 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]

Что означает, что Parallel Garbage используется для молодого поколения. «Ошибка выделения» означает, что сборка мусора началась из-за недостатка места в части кучи молодого поколения.

1 голос
/ 03 марта 2011

Вот некоторая информация о том, как программно получить информацию GC , но похоже, что для этого может понадобиться имя GC заранее. Неудобные.

Редактировать: попробуйте ManagementFactory.getGarbageCollectorMXBeans() и переберите возвращенный список. Один из них будет активным.

1 голос
/ 20 февраля 2011

Используйте GarbageCollectorMXBean s, чтобы получить MemoryPoolMXBean s.

0 голосов
/ 17 февраля 2011

Вы можете использовать флаг -XX для JRE, чтобы выбрать сборщик мусора по вашему выбору.

Настройка сборки мусора с помощью виртуальной машины Java TM 5.0

Кроме того, вы можете использовать JConsole для мониторинга сборки мусора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...