如何从 WITH IN 运行程序中获取每个 jvm 设置/参数?

问题描述

有没有办法获取 Java 程序 (JVM) 运行的所有设置从程序中使用。 是的,我希望它们在程序中使用,以便我可以记录它们作为应用程序日志的一部分。

这里有一些有用的信息 - 但他们要么从程序外部捕获此信息,要么仅列出程序内部的特定信息。

  1. Getting the parameters of a running JVM - 但这是来自程序外部而不是内部 - 我希望这些设置成为应用程序日志的一部分,即使在应用程序终止后也可以参考。

  2. Getting GC settings for running JVM - 这是特定于 GC 细节的。我想要从程序中获取 JVM 的所有参数/设置。

  3. how to get the min and max heap size settings of a JVM from within a Java program - 这也是内存特有的。

  4. How to read JVM parameters/arguments from within a running Java application - 明确传递给 JVM 的 参数。它不会捕获未明确传递给 JVM 的其他设置。

我也可以使用 JDK 之外的库 - 比如 spring 等,如果他们可以向我提供这些信息。

解决方法

您可以从 ManagementFactory 以编程方式获取有关正在运行的 JVM 的大量信息。 除了公开 JVM 信息的标准 MBean 之外,您的其他组件(如应用程序服务器、框架、应用程序代码)还可以通过 JMX 公开自定义数据并可供访问。

您可以查看 here 示例,了解如何从此接口提取内存相关信息。

同样在另一个例子中here你可以看到Tomcat服务器如何使用这个接口来记录命令行参数

List<String> args = ManagementFactory.getRuntimeMXBean().getInputArguments();
            for (String arg : args) {
                log.info(sm.getString("versionLoggerListener.arg",arg));
            }
,

如果 JVM 设置是指 VM 标志,则可以使用以下代码获取它们:

public static void main(String[] args) throws Exception {
    System.out.print(getVMFlags());
}

public static String getVMFlags() throws JMException {
    return (String) ManagementFactory.getPlatformMBeanServer().invoke(
            new ObjectName("com.sun.management:type=DiagnosticCommand"),"vmFlags",new Object[]{new String[]{"-all"}},new String[]{"[Ljava.lang.String;"});
}

示例输出:

[Global flags]
     intx ActiveProcessorCount                      = -1          {product}
    uintx AdaptiveSizeDecrementScaleFactor          = 4           {product}
    uintx AdaptiveSizeMajorGCDecayTimeScale         = 10          {product}
    uintx AdaptiveSizePausePolicy                   = 0           {product}
    uintx AdaptiveSizePolicyCollectionCostMargin    = 50          {product}
    uintx AdaptiveSizePolicyInitializingSteps       = 20          {product}
    uintx AdaptiveSizePolicyOutputInterval          = 0           {product}
    uintx AdaptiveSizePolicyWeight                  = 10          {product}
    uintx AdaptiveSizeThroughPutPolicy              = 0           {product}
    uintx AdaptiveTimeWeight                        = 25          {product}
     bool AdjustConcurrency                         = false       {product}
     bool AggressiveHeap                            = false       {product}
     bool AggressiveOpts                            = false       {product}
     intx AliasLevel                                = 3           {C2 product}
     bool AlignVector                               = false       {C2 product}
...

但是请注意,此 API 不是标准的。它仅适用于 OpenJDK / HotSpot JVM,并且可能会在任何未来版本中更改甚至删除。

,

您是否检查过弹簧靴执行器?这为 JVM 提供了大量 OOB 指标

  • 各种内存和缓冲池详细信息
  • 与垃圾收集相关的统计信息
  • 线程利用率
  • 加载/卸载的类数

参考: https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator.metrics.supported