问题描述
有没有办法获取 Java 程序 (JVM) 运行的所有设置从程序中使用。 是的,我希望它们在程序中使用,以便我可以记录它们作为应用程序日志的一部分。
这里有一些有用的信息 - 但他们要么从程序外部捕获此信息,要么仅列出程序内部的特定信息。
-
Getting the parameters of a running JVM - 但这是来自程序外部而不是内部 - 我希望这些设置成为应用程序日志的一部分,即使在应用程序终止后也可以参考。
-
Getting GC settings for running JVM - 这是特定于 GC 细节的。我想要从程序中获取 JVM 的所有参数/设置。
-
how to get the min and max heap size settings of a JVM from within a Java program - 这也是内存特有的。
-
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 指标
- 各种内存和缓冲池详细信息
- 与垃圾收集相关的统计信息
- 线程利用率
- 加载/卸载的类数