--- a/hotspot/src/share/vm/services/attachListener.cpp Fri Dec 09 06:46:57 2011 -0800
+++ b/hotspot/src/share/vm/services/attachListener.cpp Wed Dec 14 04:30:57 2011 -0800
@@ -34,6 +34,7 @@
#include "runtime/javaCalls.hpp"
#include "runtime/os.hpp"
#include "services/attachListener.hpp"
+#include "services/diagnosticCommand.hpp"
#include "services/heapDumper.hpp"
volatile bool AttachListener::_initialized;
@@ -148,6 +149,24 @@
return JNI_OK;
}
+// A jcmd attach operation request was received, which will now
+// dispatch to the diagnostic commands used for serviceability functions.
+static jint jcmd(AttachOperation* op, outputStream* out) {
+ Thread* THREAD = Thread::current();
+ // All the supplied jcmd arguments are stored as a single
+ // string (op->arg(0)). This is parsed by the Dcmd framework.
+ DCmd::parse_and_execute(out, op->arg(0), ' ', THREAD);
+ if (HAS_PENDING_EXCEPTION) {
+ java_lang_Throwable::print(PENDING_EXCEPTION, out);
+ CLEAR_PENDING_EXCEPTION;
+ // The exception has been printed on the output stream
+ // If the JVM returns JNI_ERR, the attachAPI throws a generic I/O
+ // exception and the content of the output stream is not processed.
+ // By returning JNI_OK, the exception will be displayed on the client side
+ }
+ return JNI_OK;
+}
+
#ifndef SERVICES_KERNEL // Heap dumping not supported
// Implementation of "dumpheap" command.
//
@@ -366,6 +385,7 @@
{ "inspectheap", heap_inspection },
{ "setflag", set_flag },
{ "printflag", print_flag },
+ { "jcmd", jcmd },
{ NULL, NULL }
};