我想在运行我的 java 程序时使用 Java 飞行记录器。我可以在 java 程序本身而不是在运行应用程序时传递参数吗?
例如:我有一个 java 类说“HelloWorld.class”我想在运行时使用 java 飞行记录器,我可以用它来实现
java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder HelloWorld
但我想实现这个解锁商业功能并从我的java代码启动飞行记录器。可能吗?
我想在运行我的 java 程序时使用 Java 飞行记录器。我可以在 java 程序本身而不是在运行应用程序时传递参数吗?
例如:我有一个 java 类说“HelloWorld.class”我想在运行时使用 java 飞行记录器,我可以用它来实现
java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder HelloWorld
但我想实现这个解锁商业功能并从我的java代码启动飞行记录器。可能吗?
仅当您拥有 Oracle 的商业许可时才应执行此操作,并且不应将其放入库代码中,以免其他人在不知情的情况下错误地在生产中解锁它。
在运行时,这可能是最容易做到的
Runtime.getRuntime().exec("jcmd " + pid + " VM.unlock_commercial_features");
在 JDK 9 或更高版本中,您可以从 ProcessHandle 获取 pid;
ProcessHandle.current().pid()
在早期版本中,您可以从 RuntimeMXBean 获取 pid:
String jvmName = ManagementFactory.getRuntimeMXBean().getName();
int index = jvmName.indexOf("@");
String pid = jvmName.substring(0, index);
另一种选择是使用 DiagnosticCommandMXBean 在 JMX 上执行此操作。
ObjectName on = new ObjectName("com.sun.management:type=DiagnosticCommand");
Object[] a = new Object[] {
new String[] {
}
};
String[] sig = new String[] {"[Ljava.lang.String;"};
ManagementFactory.getPlatformMBeanServer().invoke(on, "vmUnlockCommercialFeatures", a, sig);