jcmd VM.set_flag, какие флаги доступны для записи?

Я пытался поэкспериментировать с опцией jcmd VM.set_flag. Но наткнулся на одну ошибку, говорящую "можно установить только" доступные для записи "флаги". Что такое записываемые флаги?

Получение моего pid:

XXX@XXX-Air:~/javacode$ jcmd -l
6294 Test
6295 jdk.jcmd/sun.tools.jcmd.JCmd -l

Попытка изменить флаги vm:

XXX@XXX-Air:~/javacode$ jcmd 6294 VM.set_flag ConcGCThreads 4
6294:
only 'writeable' flags can be set
XXX@XXX-Air:~/javacode$ jcmd 6294 VM.set_flag MaxNewSize 1G
6294:
only 'writeable' flags can be set

Редактировать: он работал для управляемых флагов, ниже приведены успешные команды.

 XXXX@XXX-Air:~/javacode$ jcmd 11441 VM.flags -all | grep MinHeapFreeRatio
    uintx MinHeapFreeRatio                         = 40                                    {manageable} {default}
XXXX@XXX-Air:~/javacode$ jcmd 11441 VM.set_flag MinHeapFreeRatio 45
11441:
Command executed successfully
XXXX@XXX-Air:~/javacode$ jcmd 11441 VM.flags -all | grep MinHeapFreeRatio
    uintx MinHeapFreeRatio                         = 45    

2 ответа

Решение

Пишущие флаги помечены как {manageable},

Вы можете перечислить все флаги с jcmd 12345 VM.flags -all, Затем вы можете grep для управляемых (это на моей виртуальной машине Oracle jdk8):

$ jcmd 12345 VM.flags -all | grep manageable
     intx CMSAbortablePrecleanWaitMillis            = 100                                 {manageable}
     intx CMSTriggerInterval                        = -1                                  {manageable}
     intx CMSWaitDuration                           = 2000                                {manageable}
     bool HeapDumpAfterFullGC                       = false                               {manageable}
     bool HeapDumpBeforeFullGC                      = false                               {manageable}
     bool HeapDumpOnOutOfMemoryError                = false                               {manageable}
    ccstr HeapDumpPath                              =                                     {manageable}
    uintx MaxHeapFreeRatio                          = 100                                 {manageable}
    uintx MinHeapFreeRatio                          = 0                                   {manageable}
     bool PrintClassHistogram                       = false                               {manageable}
     bool PrintClassHistogramAfterFullGC            = false                               {manageable}
     bool PrintClassHistogramBeforeFullGC           = false                               {manageable}
     bool PrintConcurrentLocks                      = false                               {manageable}
     bool PrintGC                                   = false                               {manageable}
     bool PrintGCDateStamps                         = false                               {manageable}
     bool PrintGCDetails                            = false                               {manageable}
     bool PrintGCID                                 = false                               {manageable}
     bool PrintGCTimeStamps                         = false                               {manageable}

В статье о параметрах виртуальной машины говорится следующее:

Флаги, помеченные как управляемые, доступны для динамической записи через интерфейс управления JDK (com.sun.management.HotSpotDiagnosticMXBean API), а также через JConsole.

Чтобы узнать все такие флаги вы можете использовать VM.flags это было бы

Напечатайте опции флага VM и их текущие значения

с -all как вариант

Печатает все флаги, поддерживаемые виртуальной машиной

используя команду:-

jcmd <pid> VM.flags -all
Другие вопросы по тегам