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