2009-12-10 4 views
17

Я все еще изучаю проблемы, которые у меня есть с настройкой GC (см. prior question), что связано с большим количеством чтения и экспериментов.Какие параметры GC являются JVM, работающими с?

Sun Java5 + JVMs пытаются автоматически выбрать оптимальную стратегию и параметры GC на основе их окружения, что здорово, но я не могу понять, как запросить запущенную JVM, чтобы узнать, что представляют собой эти параметры.

В идеале, я хотел бы посмотреть, какие значения используются для различных параметров GC -XXX, которые автоматически выбираются виртуальной машиной. Если бы у меня было это, у меня была бы базовая линия, чтобы начать настройку.

Кто-нибудь знает, как восстановить эти значения из работающей виртуальной машины?

ответ

18

Отъезд 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")); 
     } 
    } 
} 
+0

+1 Интересно, я этого раньше не видел. У меня будет игра, посмотрим, достаточно ли она достаточно подробна. – skaffman

+0

Это действительно близко к тому, что мне нужно, за исключением того, что мне нужно знать, какие VMOptions попросить. Это настоящий позор, он не может сказать мне, что доступно. – skaffman

+0

Я изменил пример для печати доступных диагностических параметров. Однако он не печатает каждый доступный вариант виртуальной машины. Здесь перечислены все параметры виртуальной машины, вы можете закрепить строение списка тех, которые хотите, и запросить их: http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp – Kevin

0

Для этого вы можете использовать JMX. Удалите JConsole, и он должен отображаться под заголовком VM.. Он должен отображать все аргументы, которые были переданы JVM.

Чтобы сделать это программно, вы можете обратиться к другому SO ответ: How to get vm arguments from inside of java application?

+0

Спасибо, но я знаю, какие аргументы я передал VM, потому что у меня есть скрипт, который его запускает. Я хочу знать, какие значения, по которым виртуальная машина была установлена ​​по умолчанию для тех параметров, которые я не указал. – skaffman

0

Если вы ищете быстрый и простой инструмент для восприятия человеком, jconsole может быть вашим другом здесь. В частности, я смотрю на вкладке «Сводка» VM на моем запущенного процесса FindBugs и я вижу эти детали:

Текущий размер кучи: 788,720 кбайт

Максимальный размер кучи: 932,096 кбайт

совершенные память: 923,648 кбайт

В ожидании финализации: 0 объектов

сборщик мусора: Name = 'PS MarkSweep', Коллекции = 324, Общее время, затраченное = 12 минут

Сборщик мусора: Name = «PS Мусоробот», Коллекции = 1132, Общее время, затраченное = 1 минута

Очевидно, что jvisualvm даст вам родственные детали, но это, кажется, не совсем так тесно ориентированные на ваши конкретные потребности (то есть быстро читаемые детали сборщика мусора).

7

В идеале, я хотел бы видеть, какие значения используются для различных параметров GC -XX, которые автоматически выбираются виртуальной машиной. Если бы у меня было это, у меня была бы базовая линия, чтобы начать настройку.

Как правило, нетрудно вывести точную конфигурацию кучи только из флагов командной строки.

Если вам нужно знать конфигурацию кучи, и вы находитесь в среде, отличной от Windows, вы можете использовать jmap -heap, как описано в этом blog entry.

Вот образец информации, предоставленной:

 
    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) 
27

-XX: + PrintCommandLineFlags Печать флагов, передаваемых в командной строке или сконфигурированные с помощью эргономики (авто-калибровки) функции.

-XX: + PrintFlagsInitial Дампы ВСЕ флагов и значений по умолчанию.

-XX: + PrintFlagsFinal Дампы ВСЕ флагов после обработки командной строки и эргономики.

Итак, я думаю, что последний сделает для вас, просто добавьте его в свой сценарий командной строки.

Смежные вопросы