Найти, какой тип сборщика мусора работает - программирование
Подтвердить что ты не робот

Найти, какой тип сборщика мусора работает

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

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

4b9b3361

Ответ 2

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

Ответ 3

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

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

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

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

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

Начиная с J2SE 5.0, когда запускается приложение, пусковая установка может попытаться определить, приложение работает на машина "server-class", и если да, используйте Виртуальный сервер Java HotSpot Virtual Машина (сервер VM) вместо Виртуальная машина клиента Java HotSpot (клиентская виртуальная машина).

Кроме того, ссылка 2 говорит:

Примечание. Для Java SE 6 определение машина серверного класса - одна с менее 2 ЦП и не менее 2 ГБ физической памяти.

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

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

Ответ 4

-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 используется для молодого поколения. "Отказ от распределения" означает, что сбор мусора начался из-за нехватки места в куче молодого поколения.

Ответ 5

Эта команда печатает тип GC запущенного JVM:

jmap -heap <pid> | grep GC

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

например

jmap -heap 26806 | grep GC

Вывод:

Параллельный GC с 8 потоками (-ами)

Ответ 7

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

http://blogs.oracle.com/poonam/entry/how_to_programmatically_obtain_gc

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