Java 如何在运行时读取XX:MaxPermSize?

Java 如何在运行时读取XX:MaxPermSize?,java,memory,jvm,jvm-arguments,Java,Memory,Jvm,Jvm Arguments,可能重复: 我们有一个桌面应用程序,其中一些旧安装没有适当的内存设置 他们在“随机”时间体验到perm gen空间不足,我需要提醒运行MaxPermSize太低的用户,但我不知道如何从jvm访问此设置。这将给出相应的属性值 System.getProperty("XX:MaxPermSize"); 选中此url将给出相应的属性值 System.getProperty("XX:MaxPermSize"); 首先检查此url,我建议您连接或。您无法(以编程方式)确定应用程序中的PermGe

可能重复:

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


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

这将给出相应的属性值

System.getProperty("XX:MaxPermSize"); 

选中此url将给出相应的属性值

System.getProperty("XX:MaxPermSize"); 

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

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

它向您显示快照数据,而不是通信值:)

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

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

它向您显示快照数据,而不是通信的值:)

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

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);
    }
}
公共类主{
公共静态void main(最终字符串[]args){
final RuntimeMXBean memMXBean=ManagementFactory.getRuntimeMXBean();
最终字符串前缀=“-XX:MaxPermSize=”;
最终列表jvmArgs=memMXBean.getInputArguments();
字符串maxPermSize=null;
for(最终字符串jvmArg:jvmArgs){
if(jvmArg.startsWith(前缀)){
maxPermSize=jvmArg.substring(prefix.length());
打破
}
}
System.out.println(“MaxPermSize为”+MaxPermSize);
}
}

这会让你大致了解如何做

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);
    }
}
公共类主{
公共静态void main(最终字符串[]args){
final RuntimeMXBean memMXBean=ManagementFactory.getRuntimeMXBean();
最终字符串前缀=“-XX:MaxPermSize=”;
最终列表jvmArgs=memMXBean.getInputArguments();
字符串maxPermSize=null;
for(最终字符串jvmArg:jvmArgs){
if(jvmArg.startsWith(前缀)){
maxPermSize=jvmArg.substring(prefix.length());
打破
}
}
System.out.println(“MaxPermSize为”+MaxPermSize);
}
}

这不起作用,据我所知,没有可用的系统属性。我以-XX:MaxPermSize=192m作为参数java-jar“C:\java\hack\MemoryTest\dist\MemoryTest.jar”-XX:MaxPermSize=192m打印了我所有的系统属性。您提供的url与您的解决方案无关,它不起作用。据我所知,没有可用的系统属性。我以-XX:MaxPermSize=192m作为参数java-jar“C:\java\hack\MemoryTest\dist\MemoryTest.jar”-XX:MaxPermSize=192m打印了我的所有系统属性。您提供的url与您的解决方案无关,它不起作用。这并不能真正让我获得MaxPermSpace,因为您只说了当前使用的内容的快照。我需要在桌面应用程序启动期间检查参数=(这不会让我真正获得MaxPermSpace,因为你说的是当前使用的快照。我需要在桌面应用程序启动期间检查参数=(找出“-XX:MaxPermSize”的值)设置为不会告诉您实际使用了多少permgen空间。因此,只有当您能够准确预测应用程序应该使用多少permgen空间时,此方法才有帮助。找出“-XX:MaxPermSize”的值设置为不会告诉您实际使用了多少permgen空间。因此,只有当您能够准确预测应用程序应该使用多少permgen空间时,这种方法才有帮助。