2010-09-16 76 views
15

昨天,當我運行WebLogic應用服務器11g安裝,我遇到了一個內存溢出錯誤,所以我用Google搜索的答案:Java:如何檢查當前的Perm/PermGen大小?

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

一切工作:)

然而,當我三思解決方案,我可能犯了一個錯誤:我怎麼能知道這些設置?我肯定需要在覆蓋它們之前檢查它們的值,對吧?

有什麼想法?

相關鏈接:another thread on SO中的人建議嘗試和錯誤的方法,這是不理想的。

非常感謝提前。

+0

您使用的是32位還是64位操作系統? 32位版本的限制可能會限制您可以使用多少內存。 – 2010-09-16 00:57:36

+0

@詹姆斯布萊克:幸運/不幸的是,64位:) – 2010-09-16 01:03:59

回答

40

您可以使用jinfo.exe實用程序檢查運行的JVM的任何JVM標誌的值。

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

所以檢查-XX:PermSize JVM選項的值,你可以運行

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

7

您可以使用VisualVM,http://java.dzone.com/articles/best-kept-secret-jdk-visualvm&default=false&zid=159&browser=16&mid=0&refresh=0等內容來監控內存使用情況,並且您會看到最大值在哪裏出現峯值,並會給出有關內存的哪一部分實際上已滿的具體信息,因此您可以更好地優化您的環境。

您可能會發現,您沒有考慮到的內存中的某些部分實際上正在填滿,並且通過監控它可以看到您需要做些什麼才能獲得更好的性能。

+1

+1用於使用性能工具進行檢查 – linuxuser27 2010-09-16 00:53:15

4

另一種方式來獲得PermGen的信息是:

kill -3 JAVA_PID 

它得到線程轉儲和內存信息(包括PermGen)。示例輸出:

PSPermGen  total 68864K, used 68808K [0x000000009c600000, 0x00000000a0940000, 0x00000000a1800000) 

出於某種原因金佛山當我需要它沒有工作。它返回:

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

有上述的幾個可能的原因和在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那樣將其作爲同一個用戶運行。嘗試以根用戶身份運行'jinfo' /管理員 – 2015-07-09 07:40:22

+0

此命令在何處轉儲信息? – golimar 2017-03-08 15:36:56

18

描述您可以在here使用jmap他們中的一個可能是java.io.tmpdir的明確聲明,它是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的進程標識。