如何在Java程序中提供命令行选项?

时间:2019-04-25 08:30:59

标签: java command-line jfr commercial-application

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

例如:我有一个Java类,说“ HelloWorld.class”,我想在运行它的同时使用Java飞行记录器,

  

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

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

1 个答案:

答案 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);