有可能在java中获得用于启动jvm的命令吗



我想知道是否可以从代码中获得用于启动java程序的命令。

例如,如果我用启动java程序

java -cp lib1:lib2:... -jar mylib.jar com.foo.Bar

我想得到确切的字符串(包括jvm参数)。

有可能吗?


关于赏金和问题的评论

感谢大家的回复。不幸的是,我没有得到我最初想要的答案。我希望有一些可移植的解决方案来从程序本身(包括类路径等)中获得完整的java命令。因为似乎没有可移植的方案,而且由于我使用的是Linux,所以我使用agodinhostLuigi R.Viggiano的响应来解决我的问题。然而,我悬赏rahulloc获得最完整(可移植)的响应。对于其他人,所有人都投赞成票:)

下面提到的代码应该显示所有JVM参数、传递给主方法的参数以及主类名。

import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.util.List;
public static void main(String[] args) {
RuntimeMXBean bean = ManagementFactory.getRuntimeMXBean();
List<String> jvmArgs = bean.getInputArguments();
for (int i = 0; i < jvmArgs.size(); i++) {
System.out.println( jvmArgs.get( i ) );
}
System.out.println(" -classpath " + System.getProperty("java.class.path"));
// print the non-JVM command line arguments
// print name of the main class with its arguments, like org.ClassName param1 param2
System.out.println(" " + System.getProperty("sun.java.command"));
}

getInputArguments 的javadoc

返回传递给Java虚拟机的输入参数不包括main方法的参数。此方法返回如果Java虚拟机没有输入参数,则为空列表机器

某些Java虚拟机实现可能采用输入参数来自多个不同的来源:例如,从启动Java虚拟机的应用程序,例如"java"命令、环境变量、配置文件等

通常,并非"java"命令的所有命令行选项都是传递给Java虚拟机。因此,返回的输入参数可能不包括所有命令行选项。

您还可以查看:jps

这是一个Java程序,能够获得所有Java进程,包括主类和JVM的完整类名选项。

您可以很好地总结各种JVM工具,包括Java应用程序启动器链接到:

  • ManagementFactory.getRuntimeMXBean()-返回Java虚拟机运行时系统的托管bean
  • getInputArguments()javadoc
  • 确定JVM是否在调试模式下运行

您可以使用它来检索VM参数:

public static void main(String args[]) {
List<String> inputArguments = ManagementFactory.getRuntimeMXBean().getInputArguments();
System.out.println("input arguments = " + inputArguments);
}

然而,它不会为您提供所有的命令行(只提供JVM参数,没有主类或参数)。样本输出:

输入参数=[-Dfile.conding=UTF-8,-XX:-UseTLAB,-Xms2000m,-Xmx2000m,-XX:+PrintCompilation,-XX:+PrintGC]

它只适用于 Sun;Oracle JVM:System.getProperty("sun.java.command")

此外,您还可以查看JavaSysMon,它可以报告活动进程的命令行。在这里检查当前的JVM进程检查:Java程序如何获得自己的进程ID?

在linux机器中更容易运行:

ps -ef | grep java

这个命令将列出所有使用它使用的参数运行的java程序。

不确定在windows环境中可以使用什么。

在Win2003上的任务管理器中,您可以像在linux上一样启用显示命令的列。或者,你可以从命令行这样做:

wmic.exe PROCESS where "name like '%java%'" get Processid,Caption,Commandline