1

我想在运行我的 java 程序时使用 Java 飞行记录器。我可以在 java 程序本身而不是在运行应用程序时传递参数吗?

例如:我有一个 java 类说“HelloWorld.class”我想在运行时使用 java 飞行记录器,我可以用它来实现

java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder HelloWorld

但我想实现这个解锁商业功能并从我的java代码启动飞行记录器。可能吗?

4

1 回答 1

2

仅当您拥有 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);
于 2019-04-27T08:29:03.517 回答