18

昨天在运行 WebLogic Application Server 11g 安装程序时,遇到了 OutOfMemory 错误,所以我在 Google 上搜索了答案:

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

一切正常:)

但是,当我仔细考虑解决方案时,我可能会犯一个错误:我怎么知道这些的当前设置?我当然需要在覆盖它们之前检查它们的值,对吗?

有什么想法吗?

相关链接:SO 上另一个线程中的人们建议采用试错法,这并不理想。

提前谢谢了。

4

4 回答 4

42

您可以使用该jinfo.exe实用程序检查正在运行的 JVM 的任何 JVM 标志的值。

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

因此要检查-XX:PermSizeJVM 选项的值,您可以运行

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

于 2010-09-16T00:49:21.780 回答
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。

于 2014-06-05T06:13:12.387 回答
7

您可以使用 VisualVM, http: //java.dzone.com/articles/best-kept-secret-jdk-visualvm&default=false&zid=159&browser=16&mid=0&refresh=0 之类的东西来监控您的内存使用情况,您将看到最大值通过它达到峰值的位置,它将为您提供有关内存的哪一部分实际已满的具体信息,因此您可以更好地优化您的环境。

您可能会发现您没有考虑到的某些内存部分实际上正在填满,通过监视它,您可以了解您需要做什么才能获得更好的性能。

于 2010-09-16T00:48:20.567 回答
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/中所述无法打开套接字文件目标进程未响应或热点虚拟机未加载

于 2014-03-31T09:02:02.260 回答