Question: How to get in Java 6+ the list of running JVMs on the localhost and their specs (i.e. Java version, running threads, etc.)?

Does the Java API provide such features? Is there a Java library that can do this?

Answer: 
You can use [`jps`](http://download.oracle.com/javase/1.5.0/docs/tooldocs/share/jps.html), a command-line tool distributed with the jvm. I'm not aware of any normal Java API for it, though. However, JConsole can do what you ask, so I had a look at its source. It was quite scary, but while looking around I found references to the jVisualVM classes, which are OK seeing as you specify Java 6+. Here's what I found:

The classes are all in `sun.tools`, so firstly you have to find the `jconsole.jar` that came with your JVM (assumes Sun JVM, of course) and add it to your classpath. Then a quick-n-dirty listing of the active VMs can be got like:

```
public static void main(final String[] args) {
    final Map<Integer, LocalVirtualMachine> virtualMachines = LocalVirtualMachine.getAllVirtualMachines();
    for (final Entry<Integer, LocalVirtualMachine> entry : virtualMachines.entrySet()) {
        System.out.println(entry.getKey() + " : " + entry.getValue().displayName());
    }
}

```

Once you've got a reference to your JVMs, you can communicate with them using the [Attach API](http://download.oracle.com/javase/6/docs/technotes/guides/attach/index.html).
Additionally to `jps` there is the `jstack` tool, which can print out the stack trace of any java process. The start of its output contains the VM version, then comes a list of threads with their stack traces.

I think all three of jps, jstack and jconsole are implemented based on the Java Management Beans API in `javax.management.*` and `java.lang.management`, so look there for more information on how to do this in your own program.

---

Edit: Here is the [documentation index](http://download.oracle.com/javase/6/docs/technotes/guides/management/index.html) for the management stuff.
Especially interesting seems the point [Monitoring and Management Using the JMX API](http://download.oracle.com/javase/6/docs/technotes/guides/management/agent.html).

(And yes, it works not only for the own VM, also for other ones on the same system, and even for ones on remote systems if they expose the right interface.)