【问题标题】:How can i read XX:MaxPermSize during runtime? [duplicate]如何在运行时读取 XX:MaxPermSize? [复制]
【发布时间】:2012-11-14 10:09:08
【问题描述】:

可能重复:
Read Java JVM startup parameters (eg -Xmx)

我们有一个桌面应用程序,其中一些旧安装没有适当的内存设置。

他们在“随机”时间遇到 perm gen 空间不足,我需要提醒用户 MaxPermSize 运行得太低,但我不知道如何从 jvm 访问此设置。

【问题讨论】:

  • 找出“-XX:MaxPermSize”设置是什么并不能告诉您实际使用了多少永久空间。因此,只有当您能够准确预测应用程序应该使用多少永久空间时,这种方法才会有所帮助。

标签: java memory jvm jvm-arguments


【解决方案1】:

这应该让您大致了解如何操作

public class Main {
    public static void main(final String[] args) {
        final RuntimeMXBean memMXBean = ManagementFactory.getRuntimeMXBean();
        final String prefix = "-XX:MaxPermSize=";
        final List<String> jvmArgs = memMXBean.getInputArguments();
        String maxPermSize = null;
        for (final String jvmArg : jvmArgs) {
            if (jvmArg.startsWith(prefix)) {
                maxPermSize = jvmArg.substring(prefix.length());
                break;
            }
        }

        System.out.println("MaxPermSize is " + maxPermSize);
    }
}

【讨论】:

    【解决方案2】:

    首先我建议您连接JConsoleVisualVM。您无法确定应用程序中的 PermGen 大小(以编程方式)。另一种方法是使用 MemoryMXBean,但它只做简单的内存报告,但坚持使用我提到的工具来获得更详细的图片。
    因此,如果您要使用 MemoryMXBean,请尝试此代码

    MemoryMXBean memMXBean = ManagementFactory.getMemoryMXBean();
    memMXBean.getHeapMemoryUsage().getUsed();
    memMXBean.getNonHeapMemoryUsage().getUsed();
    

    它向您显示快照数据而不是计算值:)

    【讨论】:

    • 这不会真的让我得到 MaxPermSpace,因为你说的是​​现在使用的快照。我需要在启动时检查桌面应用程序的参数 =(
    【解决方案3】:

    这将给出相应的属性值。

    System.getProperty("XX:MaxPermSize"); 
    

    查看此网址How can I view the MaxPermSize in JVM?

    【讨论】:

    • 这不起作用,据我所知,没有可用的系统属性。我打印了我所有的系统属性pastie.org/5376306 以 -XX:MaxPermSize=192m 作为参数启动 java -jar "C:\Java\hack\MemoryTest\dist\MemoryTest.jar" -XX:MaxPermSize=192m
    • 您提供的网址与您的解决方案无关,它不起作用。
    猜你喜欢
    • 2010-11-30
    • 1970-01-01
    • 2013-06-17
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多