获取正在运行的JVM的参数

H-H*_*H-H 76 java jvm

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

编辑:澄清我的约束.我们要检查的JVM正在生产服务器上运行.这就是为什么,我们更喜欢最小的破坏.我们可以使用jstat监视JVM,因此我们希望有一个类似的简单解决方案来访问参数.

编辑:我们还尝试使用jvisualvm获取参数.但为了连接到远程的JVM,我们需要运行jstatd和修改JVM,我们发现是非常具有破坏性和危险的生产服务器上的安全设置.

Pet*_*rey 126

你可以使用jps之类的

jps -lvm
Run Code Online (Sandbox Code Playgroud)

打印像

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
Run Code Online (Sandbox Code Playgroud)

  • 奇迹般有效.我还在jdk中发现了jinfo工具,它具有类似的功能 (5认同)
  • 请注意,`jps -lvm`的输出可能会产生误导.始终使用jinfo或其他工具仔细检查.问题可能是如果"-XX"像普通程序参数一样传递并被JVM忽略.如果你使用`java -jar my.jar -Xmx3g`而不是`java -Xmx3g -jar my.jar`就是这种情况. (2认同)

Vip*_*pin 23

这也可以用jcmd完成

jcmd pid VM.system_properties
jcmd pid VM.flags
Run Code Online (Sandbox Code Playgroud)

我正在添加这个新答案,因为根据JDK8文档, jcmd现在是建议的方法.

建议使用最新的实用程序jcmd代替以前的jstack,jinfo和jmap实用程序,以增强诊断并降低性能开销.

jcmd pid VM.system_properties

username@users-Air:~/javacode$ jcmd -l 
11441 Test 
6294 Test 
29197 jdk.jcmd/sun.tools.jcmd.JCmd -l 
Run Code Online (Sandbox Code Playgroud)

jcmd 11441 VM.flags输出:

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
Run Code Online (Sandbox Code Playgroud)

  • pid应该替换为java进程id,Linux操作系统一般我们通过“ps -ef | ”获取它。grep jdk”,如果您看到多个进程,请提出一个新问题或尝试用谷歌搜索它 (2认同)

Jar*_*zki 20

或者,您可以使用jinfo

jinfo -flags <vmid> 
jinfo -sysprops <vmid>
Run Code Online (Sandbox Code Playgroud)

  • 此实用程序不受支持,可能会或可能不会在JDK的未来版本中可用. (3认同)

Die*_*pez 14

在Linux上:

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
Run Code Online (Sandbox Code Playgroud)

在Mac OSX上:

java -XX:+PrintFlagsFinal -version | grep -iE 'heapsize|permsize|threadstacksize'
Run Code Online (Sandbox Code Playgroud)

在Windows上:

C:\>java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"
Run Code Online (Sandbox Code Playgroud)

资料来源:https://www.mkyong.com/java/find-out-your-java-heap-memory-size/

  • 这并没有解决获取正在运行的进程的 JVM 标志的问题 (3认同)

luk*_*ymo 13

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

RuntimeMXBean

ManagementFactory

例:

RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
List<String> jvmArgs = runtimeMXBean.getInputArguments();
for (String arg : jvmArgs) {
    System.out.println(arg);
}
Run Code Online (Sandbox Code Playgroud)

  • 仅当通过时才提供值,因此没有默认设置。 (2认同)

Vla*_*nov 8

JConsole可以做到这一点.您还可以使用功能强大的jvisualVM工具,该工具自1.6.0.8开始也包含在JDK中.


Rom*_*ets 5

Windows 10 或Windows Server 2016在其标准任务管理器中提供此类信息。

在生产环境中这种情况很少见,但如果目标 JVM 在 Windows 上运行,查看其参数的最简单方法是按Ctrl+ Alt+ Delete,选择“进程”选项卡并添加“命令行”列(通过在任意位置单击鼠标右键)现有的列标题)。


小智 5

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

ps aux | grep "java"
Run Code Online (Sandbox Code Playgroud)