Java 获取正在运行的JVM的参数

Java 获取正在运行的JVM的参数,java,jvm,Java,Jvm,有没有办法获取正在运行的JVM的参数?有没有像jstat这样的命令行工具,它将JVM的pid作为输入并返回其启动参数?我对启动JVM时给出的-Xmx和-Xms值特别感兴趣。多谢各位 编辑:澄清我的限制。我们要检查的JVM正在生产服务器上运行。这就是为什么,我们更喜欢最小的干扰。我们能够使用jstat监控JVM,因此我们希望有一个类似的简单解决方案来访问参数 编辑:我们还尝试使用jvisualvm获取参数。但是,为了连接到远程jvm,我们需要运行jstatd并修改jvm的安全设置,我们发现在生产服

有没有办法获取正在运行的JVM的参数?有没有像jstat这样的命令行工具,它将JVM的pid作为输入并返回其启动参数?我对启动JVM时给出的-Xmx和-Xms值特别感兴趣。多谢各位

编辑:澄清我的限制。我们要检查的JVM正在生产服务器上运行。这就是为什么,我们更喜欢最小的干扰。我们能够使用jstat监控JVM,因此我们希望有一个类似的简单解决方案来访问参数


编辑:我们还尝试使用jvisualvm获取参数。但是,为了连接到远程jvm,我们需要运行jstatd并修改jvm的安全设置,我们发现在生产服务器上这是非常具有破坏性和风险的。此外,您还可以使用功能强大的jvisualVM工具,该工具自1.6.0.8版起就包含在JDK中。

如果您可以在java中执行此操作,请尝试:

示例:

RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
List<String> jvmArgs = runtimeMXBean.getInputArguments();
for (String arg : jvmArgs) {
    System.out.println(arg);
}
11441:
-XX:CICompilerCount=3 -XX:ConcGCThreads=1 -XX:G1ConcRefinementThreads=4 -XX:G1HeapRegionSize=1048576 -XX:InitialHeapSize=67108864 -XX:MarkStackSize=4194304 -XX:MaxHeapSize=1073741824 -XX:MaxNewSize=643825664 -XX:MinHeapDeltaBytes=1048576 -XX:NonNMethodCodeHeapSize=5830092 -XX:NonProfiledCodeHeapSize=122914074 -XX:ProfiledCodeHeapSize=122914074 -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:-UseAOT -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseG1GC 
RuntimeMXBean RuntimeMXBean=ManagementFactory.getRuntimeMXBean();
List jvmArgs=runtimeMXBean.getInputArguments();
for(字符串参数:jvmArgs){
系统输出打印项次(arg);
}
您可以像这样使用JP

jps -lvm
打印出类似于

4050 com.intellij.idea.Main -Xms128m -Xmx512m -XX:MaxPermSize=250m -ea -Xbootclasspath/a:../lib/boot.jar -Djb.restart.code=88
4667 sun.tools.jps.Jps -lvm -Dapplication.home=/opt/java/jdk1.6.0_22 -Xms8m

您可以使用JConsole命令(或任何其他JMX客户端)访问该信息。

或者,您可以使用

jinfo-标志
jinfo-sysprops

此技术适用于任何运行本地或远程的java应用程序

  • 启动java应用程序
  • 运行在JDK中找到的程序(例如C:\Program Files\Java\jdk1.8.0\u 05\bin\jvisualvm.exe)
  • 当这个有用的工具启动时,请查看 “本地”树节点
  • 双击[您的应用程序](pid[n])
  • 在右侧的选项卡中,将显示检查内容 应用在“概述”选项卡的中间,您将看到JVM。 应用程序的参数
  • jvisualvm可以在JDK 6更新7之后的任何JDK中找到。关于jvisualvm的视频教程在Linux上提供:

    java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
    
    在Mac OSX上:

    java -XX:+PrintFlagsFinal -version | grep -iE 'heapsize|permsize|threadstacksize'
    
    在Windows上:

    C:\>java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"
    

    来源:

    我添加了这个新答案,因为根据jcmd,现在是建议的方法

    建议使用最新的实用程序jcmd,而不是 以前用于增强诊断的jstack、jinfo和jmap实用程序 并减少了性能开销

    下面是获取所需属性/标志的命令

    jcmd pid VM.system_properties
    jcmd pid VM.flags
    
    我们需要pid,为此使用jcmd-l,如下所示

    username@users-Air:~/javacode$ jcmd -l 
    11441 Test 
    6294 Test 
    29197 jdk.jcmd/sun.tools.jcmd.JCmd -l 
    
    现在是时候使用这些PID来获取您想要的属性/标志了

    命令:jcmd 11441 VM.system\u属性

    11441:
    #Tue Oct 17 12:44:50 IST 2017
    gopherProxySet=false
    awt.toolkit=sun.lwawt.macosx.LWCToolkit
    file.encoding.pkg=sun.io
    java.specification.version=9
    sun.cpu.isalist=
    sun.jnu.encoding=UTF-8
    java.class.path=.
    java.vm.vendor=Oracle Corporation
    sun.arch.data.model=64
    java.vendor.url=http\://java.oracle.com/
    user.timezone=Asia/Kolkata
    java.vm.specification.version=9
    os.name=Mac OS X
    sun.java.launcher=SUN_STANDARD
    user.country=US
    sun.boot.library.path=/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/lib
    sun.java.command=Test
    http.nonProxyHosts=local|*.local|169.254/16|*.169.254/16
    jdk.debug=release
    sun.cpu.endian=little
    user.home=/Users/XXXX
    user.language=en
    java.specification.vendor=Oracle Corporation
    java.home=/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home
    file.separator=/
    java.vm.compressedOopsMode=Zero based
    line.separator=\n
    java.specification.name=Java Platform API Specification
    java.vm.specification.vendor=Oracle Corporation
    java.awt.graphicsenv=sun.awt.CGraphicsEnvironment
    sun.management.compiler=HotSpot 64-Bit Tiered Compilers
    ftp.nonProxyHosts=local|*.local|169.254/16|*.169.254/16
    java.runtime.version=9+181
    user.name=XXXX
    path.separator=\:
    os.version=10.12.6
    java.runtime.name=Java(TM) SE Runtime Environment
    file.encoding=UTF-8
    java.vm.name=Java HotSpot(TM) 64-Bit Server VM
    java.vendor.url.bug=http\://bugreport.java.com/bugreport/
    java.io.tmpdir=/var/folders/dm/gd6lc90d0hg220lzw_m7krr00000gn/T/
    java.version=9
    user.dir=/Users/XXXX/javacode
    os.arch=x86_64
    java.vm.specification.name=Java Virtual Machine Specification
    java.awt.printerjob=sun.lwawt.macosx.CPrinterJob
    sun.os.patch.level=unknown
    MyParam=2
    java.library.path=/Users/XXXX/Library/Java/Extensions\:/Library/Java/Extensions\:/Network/Library/Java/Extensions\:/System/Library/Java/Extensions\:/usr/lib/java\:.
    java.vm.info=mixed mode
    java.vendor=Oracle Corporation
    java.vm.version=9+181
    sun.io.unicode.encoding=UnicodeBig
    java.class.version=53.0
    socksNonProxyHosts=local|*.local|169.254/16|*.169.254/16
    
    命令:jcmd 11441 VM.flags输出:

    RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
    List<String> jvmArgs = runtimeMXBean.getInputArguments();
    for (String arg : jvmArgs) {
        System.out.println(arg);
    }
    
    11441:
    -XX:CICompilerCount=3 -XX:ConcGCThreads=1 -XX:G1ConcRefinementThreads=4 -XX:G1HeapRegionSize=1048576 -XX:InitialHeapSize=67108864 -XX:MarkStackSize=4194304 -XX:MaxHeapSize=1073741824 -XX:MaxNewSize=643825664 -XX:MinHeapDeltaBytes=1048576 -XX:NonNMethodCodeHeapSize=5830092 -XX:NonProfiledCodeHeapSize=122914074 -XX:ProfiledCodeHeapSize=122914074 -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:-UseAOT -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseG1GC 
    

    有关jcmd用法的更多说明,请参阅Windows 10或Windows Server 2016在其标准任务管理器中提供此类信息。对于生产来说,这是一种罕见的情况,但如果目标JVM在Windows上运行,查看其参数的最简单方法是按Ctrl+Alt+Delete,选择进程选项卡并添加命令行列(通过在任何现有列标题上单击鼠标右键).

    如果您对获取正在运行的java进程的JVM参数感兴趣,那么只需执行kill-3JavaPID即可。您将获得一个核心转储文件,在其中可以找到启动java应用程序时使用的jvm参数

    在linux上,您可以运行此命令并查看结果:

    ps aux | grep "java"
    

    _JAVA_选项是一个可以扩展的环境变量

    echo $_JAVA_OPTIONS
    

    工作起来很有魅力。我还在jdk中发现了jinfo工具,它具有类似的功能请注意,
    jps-lvm
    的输出可能有误导性。始终使用jinfo或其他工具进行双重检查。如果“-XX”像普通程序参数一样被传递,并且被JVM忽略,则可能会出现问题。如果您使用
    java-jar my.jar-Xmx3g
    而不是
    java-Xmx3g-jar my.jar
    将仅在传递时提供值,因此没有默认设置。此实用程序不受支持,在未来版本的JDK中可能可用,也可能不可用。
    -flags
    选项在OpenJDK 64位服务器VM中不存在(构建1.8.0_111-internal-alpine-r0-b14)(当前
    java:8u111 jdk-alpine
    Docker图像)我在写这个答案时考虑到了Java 6/7。除此之外,jinfo是不可靠的,但是基于Debian Jessie的Docker Java官方映像使用了
    flags
    Docker run--rm-it Java:8u111 jdk Java-version&&jinfo-h你可以在那里找到一个工具:找不到任何匹配的进程:“pid”pid应该用Java进程替换id,Linux操作系统通常我们通过“ps-ef | grep jdk”获得它,如果你看到多个进程,那么你可以问一个新问题或尝试用谷歌搜索我的公司使用Red Hat Linux,我对系统的访问非常有限。ps aux | grep“java”command列出了所有java命令及其jvm参数,如果需要,我们甚至可以grep确切的jvm参数。这在任何其他工具(如jps、jcmd等)不可用/不可访问的情况下非常有用。OP明确声明jvisualvm不是选项。