当前位置: 首页 > 知识库问答 >
问题:

在运行的JVM中,如何以编程方式确定启动时使用的JVM选项?

郎献
2023-03-14

背景:我正在对通过几层间接启动的Java应用程序进行一些性能测试,因此我不完全确定该应用程序是否以我认为的标志启动。我希望我的应用程序包括一个健全性检查(在开始其性能测试之前)并在结果(测试之后)中包含有关如何调整JVM的信息,例如:

  • 使用了哪个垃圾收集器

Java代码是否有办法(在运行的JVM中)查询用于包含JVM的实际选项?(假设我看不到启动我的命令行,因此我无法重新解析这些标志。)

如果没有通用的方法来确定这一点,那么也欢迎针对特定JVM实现的答案。

更新:

对于解决方案来说,重要的是能够知道命令行中未显式提供的任何值的默认值是什么。否则,要查找给定JVM/platform/version/architecture组合的默认值,将需要大量(容易出错)的工作。我正在测试各种jvm,所以我不想手动确定每个jvm版本中每个参数的默认设置是什么。

共有3个答案

宗冠宇
2023-03-14

您可以使用JMX客户端(如VisualVM),然后调用getVMOption(字符串名),请参阅热点诊断Cxbean。

或者,如果您可以传入至少一组标志来启用JVM日志记录,那么它应该是-XX:LogVMOutput-XX:LogFile=JVM。记录日志,然后解析应用程序中的日志输出。日志包含用于启动JVM的所有标志/参数。

另一种选择是使用ps-ef列出由PID启动的JVM进程,您可以在那里看到该进程的所有输入参数。这应该适用于任何JVM类型。

司空瑾瑜
2023-03-14

以下Java 7代码将列出由打印标志最终返回的所有JVM选项。它尝试使用反射来访问受包保护的辅助类(自Java 6以来可用),并返回到热点诊断Cxbean。GetDiagnostiOptions()如果不起作用。

// load the diagnostic bean first to avoid UnsatisfiedLinkError
final HotSpotDiagnosticMXBean hsdiag = ManagementFactory
        .getPlatformMXBean(HotSpotDiagnosticMXBean.class);
List<VMOption> options;
try {
    final Class<?> flagClass = Class.forName("sun.management.Flag");
    final Method getAllFlagsMethod = flagClass.getDeclaredMethod("getAllFlags");
    final Method getVMOptionMethod = flagClass.getDeclaredMethod("getVMOption");
    getAllFlagsMethod.setAccessible(true);
    getVMOptionMethod.setAccessible(true);
    final Object result = getAllFlagsMethod.invoke(null);
    final List<?> flags = (List<?>) result;
    options = new ArrayList<VMOption>(flags.size());
    for (final Object flag : flags) {
        options.add((VMOption) getVMOptionMethod.invoke(flag));
    }
} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException
        | InvocationTargetException | ClassCastException e) {
    if (hsdiag != null) {
        // only includes writable external flags
        options = hsdiag.getDiagnosticOptions();
    } else {
        options = Collections.emptyList();
    }
}
final Map<String, VMOption> optionMap = new TreeMap<>();
for (final VMOption option : options) {
    optionMap.put(option.getName(), option);
}
for (final VMOption option : optionMap.values()) {
    System.out.println(option.getName() + " = " + option.getValue() + " (" +
            option.getOrigin() + ", " +
            (option.isWriteable() ? "read-write" : "read-only") + ")");
}
System.out.println(options.size() + " options found");

使用7u71,我得到663个选项,或者使用-XX:UnlockDiagnosticVMOptions-XX:UnlockExperimentalVMOptions,779。

宋高寒
2023-03-14

您可以通过以下方式获取命令行参数:

ManagementFactory.getRuntimeMXBean().getInputArguments();
 类似资料:
  • 问题内容: 有没有办法找出自JVM启动以来的时间? 当然,除了在的开始位置附近启动计时器外,因为在我的场景中,我正在编写库代码,并且要求在启动后立即调用某些东西的负担太重。 问题答案: 使用以下代码段: 要么: 这是检索JVM运行时间的 正确 方法。 有关更多信息,请参见http://java.sun.com/j2se/1.5.0/docs/api/java/lang/management/Run

  • 我们可以使用这些jvm标志来确定编译阈值,但是有没有一种方法可以在运行时以编程方式确定它?

  • 问题内容: 不是Java中的关键字。JVM如何知道将方法作为任何程序的起点执行? 问题答案: 不需要是Java中的关键字即可让JVM在执行开始时查找它。与其他也称为的方法或变量没有冲突。这就是JVM规范的设计方式。它很可能是从c语言借来的。 Java规范参考:关键字,调用main。

  • 我设法使用exe模式启动了一个自定义运行时映像,并使用jvm模式启动了一个传统的Java程序(类路径+普通JDK),但我无法使用jvm模式(它不会启动新进程)来启动映像。 prunsrv有一个“jvmoptions9”参数,这可能暗示这个场景可能被支持,但我不确定。

  • 向mvn spring boot:run启动的程序添加JVM选项的最佳方法是什么?

  • 我有一个使用Robolectrec进行单元测试的项目。这个项目使用Robolectrec 3.0,需要在虚拟机选项中添加和选项。 在Android Studio中,我在