Java:如何检查当前Perm / PermGen大小?

18

昨天我运行WebLogic应用服务器11g安装程序时,遇到了OutOfMemory错误,于是我搜索了答案:

java -Xms256m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=256m -jar wls1032_generic.jar

一切都正常 :)

然而,当我仔细想了想这个解决方案时,我可能犯了一个错误:我如何知道它们的当前设置?在覆盖它们之前,我肯定需要检查它们的值,对吗?

有什么想法吗?

相关链接:另一个 SO 帖子中的人们建议使用试错方法,但这并不理想。

预先感谢您的帮助。


你使用的是32位还是64位操作系统?在32位版本上有一些限制,可能会对你可以使用多少内存造成过多的限制。 - James Black
@James Black:幸运的是/不幸的是,64位 :) - Michael Mao
标题和描述中的问题含义不明确。当前大小可以使用jmap进行检查,当前设置可以使用jmap和jinfo进行检查。 - FuePi
4个回答

42
您可以使用 jinfo.exe 工具来检查运行中 JVM 的任何 JVM 标志的值。

%JAVA_HOME%\bin\jinfo.exe -flag <flagName> <pid>

例如,要检查 -XX:PermSize JVM 选项的值,您可以运行

%JAVA_HOME%\bin\jinfo.exe -flag PermSize <pid>


23

你可以在这里使用jmap,它是JVM Heap Dump Tool。

例如:

jmap -heap 5900

它将打印:

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 989855744 (944.0MB)
   NewSize          = 1310720 (1.25MB)
   MaxNewSize       = 17592186044415 MB
   OldSize          = 5439488 (5.1875MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 21757952 (20.75MB)
   MaxPermSize      = 85983232 (82.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 242352128 (231.125MB)
   used     = 9196056 (8.770042419433594MB)
   free     = 233156072 (222.3549575805664MB)
   3.79450185805672% used
From Space:
   capacity = 41877504 (39.9375MB)
   used     = 0 (0.0MB)
   free     = 41877504 (39.9375MB)
   0.0% used
To Space:
   capacity = 42663936 (40.6875MB)
   used     = 0 (0.0MB)
   free     = 42663936 (40.6875MB)
   0.0% used
PS Old Generation
   capacity = 80609280 (76.875MB)
   used     = 34187936 (32.604156494140625MB)
   free     = 46421344 (44.270843505859375MB)
   42.41191088668699% used
PS Perm Generation
   capacity = 85393408 (81.4375MB)
   used     = 63472624 (60.53221130371094MB)
   free     = 21920784 (20.905288696289062MB)
   74.32965317416539% used

它获取内存信息(包括PermGen)。5900是Java的进程ID。


7

4

获取PermGen信息的另一种方法是:

kill -3 JAVA_PID

它获取线程转储和内存信息(包括PermGen)。示例输出:
PSPermGen       total 68864K, used 68808K [0x000000009c600000, 0x00000000a0940000, 0x00000000a1800000)

有些时候我需要使用jinfo命令,但它无法正常工作,返回了以下内容:

Unable to open socket file: target process not responding or HotSpot VM not loaded

以上问题有几个可能的原因,其中之一可能是明确声明了java.io.tmpdir,如https://www.permeance.com.au/web/terry.mueller/home/-/blogs/unable-to-open-socket-file-target-process-not-responding-or-hotspot-vm-not-loaded中所述。


1
有可能 jinfo 无法工作,因为您未将其作为与 JVM 相同的用户运行。尝试以 root/Administrator 身份运行 jinfo - Alastair McCormack

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