代码之家  ›  专栏  ›  技术社区  ›  Michael Mao

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

  •  16
  • Michael Mao  · 技术社区  · 14 年前

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

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

    一切正常:)

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

    有什么想法吗?

    中的人 another thread on SO

    非常感谢。

    4 回复  |  直到 8 年前
        1
  •  42
  •   Strelok    14 年前

    jinfo.exe 实用程序。

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

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

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

        2
  •  22
  •   Alan    10 年前

    你可以用 jmap here ,它是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。

        3
  •  7
  •   James Black    14 年前

    http://java.dzone.com/articles/best-kept-secret-jdk-visualvm&default=false&zid=159&browser=16&mid=0&refresh=0 ,以监视内存使用情况,您将看到最大值的峰值,它将为您提供具体的信息,说明哪部分内存实际已满,因此您可以更好地优化您的环境。

    你可能会发现你没有考虑的部分内存实际上已经被填满了,通过监视它,你可以看到你需要做些什么来获得更好的性能。

        4
  •  4
  •   Jacek    11 年前

    获取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