2017-10-17 181 views
5

我试图用jcmd VM.set_flag选项进行试验。但遇到一个错误,说只有'可写'标志可以设置“。什么是可写标志?jcmd VM.set_flag,哪些标志是可写的?

让我的PID:

[email protected]:~/javacode$ jcmd -l 
6294 Test 
6295 jdk.jcmd/sun.tools.jcmd.JCmd -l 

试图改变VM标志:

[email protected]:~/javacode$ jcmd 6294 VM.set_flag ConcGCThreads 4 
6294: 
only 'writeable' flags can be set 
[email protected]:~/javacode$ jcmd 6294 VM.set_flag MaxNewSize 1G 
6294: 
only 'writeable' flags can be set 

编辑:工作了管理的标志,下面是成功的命令。

[email protected]:~/javacode$ jcmd 11441 VM.flags -all | grep MinHeapFreeRatio 
    uintx MinHeapFreeRatio       = 40         {manageable} {default} 
[email protected]:~/javacode$ jcmd 11441 VM.set_flag MinHeapFreeRatio 45 
11441: 
Command executed successfully 
[email protected]:~/javacode$ jcmd 11441 VM.flags -all | grep MinHeapFreeRatio 
    uintx MinHeapFreeRatio       = 45  
+2

VM.set_flag是在Java 9可用经由http://openjdk.java.net/jeps/228,它是jdk9特定选项。不是吗? – Vipin

回答

3

可写入标记标记为{manageable}

您可以用jcmd 12345 VM.flags -all列出所有标志。然后,您可以grep为易于管理的(该是我的Oracle jdk8 VM):

$ 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} 
3

VM options美国这样做的文章: - 标

标志为管理是动态可写通过JDK 管理接口(com.sun.management.HotSpotDiagnosticMXBean API) 并且也通过JConsole。

找出所有这样的标志,你可以使用VM.flags那会

打印VM标志选项及其当前值

-all作为选项

打印VM支持的所有标志

使用命令: -

jcmd <pid> VM.flags -all