我想在运行Java程序时使用Java飞行记录器。我可以在Java程序本身而不是在运行应用程序时传递参数。
例如:我有一个Java类,说“ HelloWorld.class”,我想在运行它的同时使用Java飞行记录器,
java -XX:+ UnlockCommercialFeatures -XX:+ FlightRecorder HelloWorld
但是我想实现这种解锁商业功能,并从我的Java代码启动飞行记录器。有可能吗?
答案 0 :(得分:1)
仅当您拥有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);