Ответ 1
java -XX:+PrintCommandLineFlags -version
покажет вам сборщик мусора по умолчанию. Я также нашел следующую полезную страницу, которая детализирует сборщик мусора по умолчанию для различных операционных систем.
Post JSE 5 эргономика предназначена для автоматического выбора подходящего типа сборщика мусора для вас (между прочим).
Я хотел бы знать, есть ли способ подтвердить/узнать тип сборщика мусора и выбранные цели производительности/текущий, заданный эргономикой JVM.
java -XX:+PrintCommandLineFlags -version
покажет вам сборщик мусора по умолчанию. Я также нашел следующую полезную страницу, которая детализирует сборщик мусора по умолчанию для различных операционных систем.
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
Не прямой ответ на ваш вопрос, но я считаю, что это то, что вы ищете.
Согласно документации 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 во время выполнения.
Возможно, вы найдете правильный ответ для не-серверных машин, если вы еще больше углубитесь в документацию.
-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 используется для молодого поколения. "Отказ от распределения" означает, что сбор мусора начался из-за нехватки места в куче молодого поколения.
Эта команда печатает тип GC запущенного JVM:
jmap -heap <pid> | grep GC
Для современного компьютера (множественный процессор, большая память) JVM обнаружит его как серверную машину и по умолчанию использует Parallel GC
, если вы не укажете, какой gc использовать через флаги JVM явно.
например
jmap -heap 26806 | grep GC
Вывод:
Параллельный GC с 8 потоками (-ами)
Используйте GarbageCollectorMXBean, чтобы получить MemoryPoolMXBean s.
Вот некоторая информация о том, как программно получить информацию GC, но похоже, что ей может понадобиться имя GC заранее. Неудобные.
http://blogs.oracle.com/poonam/entry/how_to_programmatically_obtain_gc
Изменить: попробуйте ManagementFactory.getGarbageCollectorMXBeans()
и выполните итерацию по возвращенному списку. Один из них будет активным.
Вы можете использовать флаг -XX
для JRE, чтобы выбрать сборщик мусора по вашему выбору.
Настройка коллекции мусора с виртуальной машиной 5.0 Java TM
Кроме того, вы можете использовать JConsole для мониторинга сбора мусора.