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

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

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

一切正常:)

但是,当我对解决方案三思而后行时,我可能犯了一个错误:我怎么能知道这些设置的当前设置? 我当然需要在覆盖它们之前检查它们的值,对吧?

有什么想法吗?

相关链接:人们在SO的另一个post中提出了试错法,这并不理想。

提前谢谢了。

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

%JAVA_HOME%\bin\jinfo.exe -flag

所以要检查-XX:PermSize JVM选项的值,你可以运行

%JAVA_HOME%\bin\jinfo.exe -flag PermSize

你可以在这里使用jmap ,它是JVM堆转储工具。

例如:

 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。

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

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

获取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/所述。 无法对开放套接字文件-目标-过程-不回应,或热点-VM-未加载