Какие параметры GC - это JVM?
Я все еще изучаю проблемы, которые у меня есть с настройкой GC (см. предыдущий вопрос), что связано с большим количеством чтения и экспериментов.
Sun Java5 + JVM пытаются автоматически выбрать оптимальную стратегию и параметры GC на основе их среды, что здорово, но я не могу понять, как запросить запущенную JVM, чтобы узнать, что эти параметры.
В идеале, я хотел бы увидеть, какие значения используются для различных параметров GC -XXX, которые автоматически выбираются виртуальной машиной. Если бы у меня было это, я мог бы начать базовую настройку.
Кто-нибудь знает, как восстановить эти значения из работающей VM?
Ответы
Ответ 1
Посмотрите HotSpotDiagnosticMBean
В следующем примере будет отображаться значение параметра, а также значение DEFAULT или VM_CREATION:
import java.lang.management.ManagementFactory;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeData;
import javax.management.openmbean.CompositeDataSupport;
public class HotSpotTest {
public static void main(String [] args) throws Exception {
printHotSpotOption("MaxHeapFreeRatio");
printHotSpotOption("SurvivorRatio");
printHotSpotOptions();
}
private static void printHotSpotOption(String option) throws Exception {
ObjectName name = new ObjectName("com.sun.management:type=HotSpotDiagnostic");
String operationName = "getVMOption";
Object [] params = new Object [] {option};
String [] signature = new String[] {String.class.getName()};
Object result = ManagementFactory.getPlatformMBeanServer().invoke(name, operationName, params, signature);
CompositeDataSupport data = (CompositeDataSupport) result;
System.out.println(option);
System.out.println("- Value: "+data.get("value"));
System.out.println("- Origin: "+data.get("origin"));
}
private static void printHotSpotOptions() throws Exception {
ObjectName name = new ObjectName("com.sun.management:type=HotSpotDiagnostic");
String attributeName = "DiagnosticOptions";
Object result = ManagementFactory.getPlatformMBeanServer().getAttribute(name, attributeName);
CompositeData [] array = (CompositeData[]) result;
for (CompositeData d : array) {
System.out.println(d.get("name"));
System.out.println("- Value: "+d.get("value"));
System.out.println("- Origin: "+d.get("origin"));
}
}
}
Ответ 2
-XX: + PrintCommandLineFlags
Печать флагов передается в командной строке или настраивается с помощью функций эргономики (авто-калибровки).
-XX: + PrintFlagsInitial
Сбрасывает ВСЕ флаги и значения по умолчанию.
-XX: + PrintFlagsFinal
Сбрасывает ВСЕ флагов после обработки командной строки и эргономики.
Итак, я думаю, что последний сделает для вас, просто добавьте его в свою командную строку script.
Ответ 3
В идеале, я хотел бы увидеть, какие значения используются для различных параметров GC -XXX, которые автоматически выбираются виртуальной машиной. Если бы у меня было это, я мог бы начать базовую настройку.
Это не так просто, чтобы вывести точную конфигурацию кучи только из предоставленных флагов командной строки.
Если вам нужно знать конфигурацию кучи, и вы находитесь в среде, отличной от Windows, вы можете использовать jmap -heap
, как описано в этой записи .
Вот пример представленной информации:
using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 1073741824 (1024.0MB)
NewSize = 268435456 (256.0MB)
MaxNewSize = 268435456 (256.0MB)
OldSize = 805306368 (768.0MB)
NewRatio = 7
SurvivorRatio = 6
PermSize = 21757952 (20.75MB)
MaxPermSize = 88080384 (84.0MB)
Ответ 4
Вы можете использовать JMX для этого. Удалите JConsole и он должен отображаться на вкладке VM Summary. Он должен отображать все аргументы, которые были переданы JVM.
Чтобы сделать это программно, вы можете обратиться к другому ответу SO: Как получить аргументы vm из java-приложения?
Ответ 5
Если вы ищете быстрый и удобный инструмент для чтения человеком, jconsole может быть вашим другом здесь. В частности, я просматриваю вкладку "Резюме VM" в моем текущем запуске процесса FindBugs, и я вижу следующие данные:
Текущий размер кучи: 788 720 кбайт
Максимальный размер кучи: 932,096 кбайт
Оперативная память: 923 648 килобайт
Ожидание завершения: 0 объектов
Сборщик мусора: Name = 'PS MarkSweep', Коллекции = 324, Общее время, потраченное = 12 минут
Сборщик мусора: Name = 'PS Scavenge', Collections = 1,132, Общее время, потраченное = 1 минута
Очевидно, что jvisualvm предоставит вам связанные детали, но, похоже, это не так сильно сфокусировано на ваших конкретных потребностях ( т.е. быстро читаемые детали сборщика мусора).