【问题标题】:Is it possible to get the command used to launch the jvm in java?是否可以获得用于在 java 中启动 jvm 的命令?
【发布时间】:2012-12-07 03:43:50
【问题描述】:

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

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

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

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

有可能吗?


评论赏金和问题

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

【问题讨论】:

  • @SubinS 它将通过java执行OS命令。他想在命令提示符中使用该命令。
  • 删除了该评论。谢谢
  • 您是否希望从正在运行的程序中获取命令?

标签: java jvm


【解决方案1】:

下面提到的代码应该显示所有 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"));
}

getInputArguments的javadoc

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

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

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

你也可以看看:jps

这是一个 Java 程序,能够为所有用户获取完整的命令行 Java进程,包括主类和JVM的全类名 选项。

你可以找到各种JVM tools的很好的总结,包括 Java Application Launcher 链接:

【讨论】:

  • "determine if JVM is running in debug mode" 链接已失效,但文章中的相关代码为 List inputArgs = ManagementFactory.getRuntimeMXBean().getInputArguments(); if (!inputArgs.contains("-Xdebug")) - 所以自 Java 5 以来它不是很相关。
【解决方案2】:

您可以使用this 检索虚拟机参数:

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

但是它不会给你所有的命令行(只给出 JVM 参数,没有主类也没有参数)。示例输出:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      ps -ef | grep java
      

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

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

      【讨论】:

      【解决方案5】:

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

      另外,你可以看看JavaSysMon,它可以报告活动进程的命令行。要检查哪个是当前的 JVM 进程,请在此处检查:How can a Java program get its own process ID?

      【讨论】:

      • 对不起,不起作用;改装。对(缺少)格式表示歉意:$ java -showversion -classpath toys/ -Xms16M -Xmx20M Env | grep command java version "1.7.0_09" Java(TM) SE Runtime Environment (build 1.7.0_09-b05) Java HotSpot(TM) 64-Bit Server VM (build 23.5-b02, mixed mode) sun.java.command=Env Env 是一个简单的 Java 程序,用于将系统属性转储到标准输出。
      猜你喜欢
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 2014-01-19
      • 2019-07-29
      • 1970-01-01
      • 2020-02-26
      • 2012-12-18
      • 1970-01-01
      相关资源
      最近更新 更多