Подтвердить что ты не робот

Какие параметры GC - это JVM?

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

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

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

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

4b9b3361

Ответ 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 предоставит вам связанные детали, но, похоже, это не так сильно сфокусировано на ваших конкретных потребностях ( т.е. быстро читаемые детали сборщика мусора).