查找给定Java进程的-Xms和-Xmx变量值的命令是什么?

16

我有一个Java程序,我使用jps运行并找到了它的进程ID。

如何查看此Java进程的-Xms和-Xmx变量的值?


从你对SQL注入的回答中,似乎你的Mac上有一个不同的jps。你能否在你的问题中添加以下信息:(1)哪个MacOS X版本。(2)哪个Java版本。(3)运行which jps的结果。(4)运行file $(which jps)的结果。 - RealSkeptic
  1. 哪个JPS - /usr/bin/jps
  2. Java版本 - Java版本 "1.7.0_55"
  3. MacOSX 版本 - 10.7.5
  4. 文件 $(which jps) -> /usr/bin/jps: Mach-O通用二进制文件,具有2种架构 /usr/bin/jps(适用于x86_64架构):Mach-O 64位可执行文件x86_64 /usr/bin/jps(适用于i386架构):Mach-O可执行文件i386
- Adon Smith
3个回答

21

尝试

jcmd <PID> VM.command_line
jcmd <PID> VM.flags

输出结果给了我这些参数:-XX:InitialHeapSize=1073741824 -XX:MaxHeapSize=17179869184 -XX:+UseCompressedOops -XX:+UseParallelGC。这些值是字节吗?如果最大堆大小为17 GB,那么这是否有可能呢?因为在运行我的程序之前,我的JAVA_OPTS设置为export JAVA_OPTS='-Xms128m -Xmx1024m',它不应该超过1 GB。 - Adon Smith
@AdonSmith JVM本身不识别JAVA_OPTS。请尝试使用_JAVA_OPTIONS - apangin

8
您可以使用JPS并从命令行执行此操作:
jps # shows pids
jps -v <pid> # shows params
jps -v <localhost:pid> # the host must be indicated

如果这不够用,你可以在程序内以编程方式检查Java虚拟机尝试使用的最大内存量: (点击此处)
Runtime.getRuntime().maxMemory()

您可以使用类MemoryUsage获取内存管理的初始值、已使用量和最大可用量。

MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
    memoryBean.getHeapMemoryUsage().getMax()
    memoryBean.getHeapMemoryUsage().getUsed()
    memoryBean.getHeapMemoryUsage().getInit()

我正在使用Mac OS 10.10操作系统 - 当我输入命令jps -v <pid>时,它失败了 - grep: 89038: 没有那个文件或目录。 - Adon Smith
1
我不想用编程的方式来做。只需要一个命令就可以了 :( - Adon Smith
@AdonSmith,您需要指定主机。请再次查看我的回答。 - SQL.injection
我运行了命令 "jps -v localhost:89038",但它给了我一个输出:"grep: localhost:89038: 没有那个文件或目录"。 - Adon Smith
@AdonSmith 很可能不存在该进程编号。我建议不要带上该编号直接运行 jps -lvm - Peter Lawrey
我使用的是Mac OS系统,所以你的命令可能不适用于此系统,这可能是原因吗?因为有一个进程ID,我是通过执行jps命令找到的。 - Adon Smith

6
我认为jmap命令可以给你想要的所有信息。
用法:jmap -heap {pid}
root@BobServerStation:/usr/local $ jmap -heap 3280
Attaching to process ID 3280, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.65-b04

using thread-local object allocation.
Parallel GC with 8 thread(s)

Heap Configuration:
   MinHeapFreeRatio = 0
   MaxHeapFreeRatio = 100
   MaxHeapSize      = 4116709376 (3926.0MB)
   NewSize          = 1310720 (1.25MB)
   MaxNewSize       = 17592186044415 MB
   OldSize          = 5439488 (5.1875MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 21757952 (20.75MB)
   MaxPermSize      = 85983232 (82.0MB)
   G1HeapRegionSize = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 65011712 (62.0MB)
   used     = 42273152 (40.3148193359375MB)
   free     = 22738560 (21.6851806640625MB)
   65.0239021547379% used
From Space:
   capacity = 10485760 (10.0MB)
   used     = 10479760 (9.994277954101562MB)
   free     = 6000 (0.0057220458984375MB)
   99.94277954101562% used
To Space:
   capacity = 10485760 (10.0MB)
   used     = 0 (0.0MB)
   free     = 10485760 (10.0MB)
   0.0% used
PS Old Generation
   capacity = 171442176 (163.5MB)
   used     = 376368 (0.3589324951171875MB)
   free     = 171065808 (163.1410675048828MB)
   0.21953057805332568% used
PS Perm Generation
   capacity = 22020096 (21.0MB)
   used     = 15401488 (14.688003540039062MB)
   free     = 6618608 (6.3119964599609375MB)
   69.94287400018601% used

8464 interned Strings occupying 699456 bytes.

它给了我错误:attach: task_for_pid(18830) 失败(5) 连接进程出错: sun.jvm.hotspot.debugger.DebuggerException: 无法附加到该进程 - Adon Smith
请使用 sudo jmap -heap {pid} @Adon Smith - Hunter Zhao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接