使用Java或JVMTI标识当前的JVM

我想确定当前运行的JVM。 在JVMTI文档中描述的函数的最佳情况下,但我找不到任何东西。


我的意思是这样的: VirtualMachine.list()提供:

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

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

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

例如,使用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)

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

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

以下是一些更多信息的链接:

Java程序如何获得自己的进程ID? http://www.google.com/search?q=find+current+java+process+id

JVM没有一个链接到它的调用的标识类,至少没有一个可以轻松查询的标识类。

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