【问题标题】:Identify the current JVM with Java or JVMTI用 Java 或 JVMTI 识别当前 JVM
【发布时间】:2011-04-07 15:56:16
【问题描述】:

我想确定当前正在运行的 JVM。在最好的情况下使用JVMTI Documentation 中描述的功能,但我找不到任何东西。


我的意思是这样的:VirtualMachine.list() 传递:

[sun.tools.attach.WindowsAttachProvider@46ae506e: 2440 de.fu.profiler.view.MainFrame...

但它会显示所有 JVM,而不是当前正在运行的 JVM。

【问题讨论】:

  • “识别当前正在运行的JVM”是什么意思
  • 您似乎在追求一个有缺陷的策略来实现一个未说明的目标。目标是什么?

标签: java jvm jvmti


【解决方案1】:

您可以从RuntimeMXBean 获得一个唯一的名称。在大多数平台上,这包括当前进程的 processid。

【讨论】:

    【解决方案2】:

    使用 Java 系统属性,例如

    java.runtime.name=Java(TM) 2 Runtime Environment, Standard Edition
    java.runtime.version=1.5.0_01-b08
    java.specification.name=Java Platform API Specification
    java.specification.vendor=Sun Microsystems Inc.
    java.specification.version=1.5
    java.vendor=Sun Microsystems Inc.
    java.vendor.url=http://java.sun.com/
    java.vendor.url.bug=http://java.sun.com/cgi-bin/bugreport.cgi
    java.version=1.5.0_01
    java.vm.info=mixed mode, sharing
    java.vm.name=Java HotSpot(TM) Client VM
    java.vm.specification.name=Java Virtual Machine Specification
    java.vm.specification.vendor=Sun Microsystems Inc.
    java.vm.specification.version=1.0
    java.vm.vendor=Sun Microsystems Inc.
    java.vm.version=1.5.0_01-b08
    

    使用java.lang.System.getProperties()getProperty(String name)

    【讨论】:

    • 这看起来不错,但是我找不到任何唯一标识符。我正在寻找诸如进程 ID 或应用程序名称之类的东西。名称将是例如:com.fun.MyApplication
    • 所以您不是要识别 JVM,而是要识别它运行的机器?请澄清您所说的“唯一 ID”是什么意思。
    • @Jim-Garrison:我正在尝试识别从其他也在操作系统上运行的 JVM 运行的 JVM。例如,目前我正在运行运行 Eclipse 的 JVM。
    • 我认为没有内置的 JVM 唯一 ID。有关其他建议,请参阅此问题 stackoverflow.com/questions/2834749
    【解决方案3】:

    jps(JDK 自带的命令行工具)会列出当前运行的 Java 进程。

    您可以使用 JMX 查找并附加到不同的正在运行的 Java 进程。

    http://download.oracle.com/javase/1.5.0/docs/guide/management/agent.html

    您需要启用监控。

    查找您当前的 PID 非常依赖于操作系统。这是一篇包含更多建议的博文:

    http://blog.igorminar.com/2007/03/how-java-application-can-discover-its.html

    这里有更多信息的链接:

    How can a Java program get its own process ID? http://www.google.com/search?q=find+current+java+process+id

    【讨论】:

      【解决方案4】:

      System.getProperty("java.runtime.name") 会吗?

      【讨论】:

      • 不,这会打印出类似:Java(TM) SE Runtime Environment。这就是一切,但不是独一无二的。
      【解决方案5】:

      JVM 没有一个与其调用相关联的标识类,至少没有一个您可以轻松查询的类。

      如果您使用的是 JVMTI,则可以识别您已连接到的 JVM 中正在运行的线程。可能有一个或多个线程,这取决于 JVM 是运行图形界面还是(例如)企业容器。对于给定的线程,您可以检查堆栈并识别正在调用的当前方法。如果您遍历堆栈,您可以决定父类是 JVM 的一部分(例如 java.lang.)还是应用程序特定的类(例如 com.fun.)。这可以让您唯一标识正在检查的 JVM 的“目标”。

      【讨论】:

        猜你喜欢
        • 2016-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多