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

Jac*_*ack 37 java jvm

我想知道是否有可能从代码中获取用于启动java程序的命令.

例如,如果我启动一个java程序:

 java -cp lib1:lib2:... -jar mylib.jar com.foo.Bar
Run Code Online (Sandbox Code Playgroud)

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

可能吗?


评论赏金和问题

谢谢大家的回复.不幸的是,我没有得到我最初寻找的答案.我希望有一些可移植的解决方案从程序本身(包括类路径等)中获取完整的java命令.因为似乎没有可移植的解决方案,因为我使用Linux,我使用agodinhostLuigi R. Viggiano的响应来解决我的问题.然而,我将赏金给予rahulroc以获得最完整(便携)的响应.其余为所有人的upvote :)

Rah*_*hul 24

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

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"));
}
Run Code Online (Sandbox Code Playgroud)

用于getInputArguments的 javadoc

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

一些Java虚拟机实现可以从多个不同的源获取输入参数:例如,从启动Java虚拟机的应用程序传递的参数,例如'java'命令,环境变量,配置文件等.

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

您还可以查看:jps

它是一个Java程序,能够获取所有Java进程的完整命令行,包括主类的完整类名和JVM选项.

您可以找到各种JVM工具的完美摘要,包括 Java Application Launcher链接到:

  • “确定JVM是否在调试模式下运行”链接已失效,但文章中的相关代码为`List inputArgs = ManagementFactory.getRuntimeMXBean()。getInputArguments();。if(!inputArgs.contains(“-Xdebug”))`-从Java 5开始就不太相关了。 (2认同)

ass*_*ias 18

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

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

但是它不会给你所有的命令行(只给出JVM参数,没有主类和参数).样本输出:

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


Lui*_*ano 7

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

另外,您可以查看JavaSysMon,它可以报告活动进程的命令行.要检查当前JVM进程检查哪个:Java程序如何获得自己的进程ID?


ago*_*ost 7

在linux机器上运行会更容易:

ps -ef | grep java
Run Code Online (Sandbox Code Playgroud)

此命令将列出使用其已使用参数运行的所有Java程序.

不确定在Windows环境中可以使用什么.


dja*_*fan 5

在Win2003上的任务管理器中,您可以启用显示命令的列,就像在linux上一样.或者,您可以从命令行执行此操作:

wmic.exe PROCESS where "name like '%java%'" get Processid,Caption,Commandline
Run Code Online (Sandbox Code Playgroud)