Extend jcmd to java application level

Ioi Lam ioi.lam at oracle.com
Fri Oct 8 07:22:29 UTC 2021

On 10/7/21 6:25 PM, David Holmes wrote:
> Hi Denghui,
> On 7/10/2021 11:58 pm, Denghui Dong wrote:
>> Hi team,
>> The `jcmd` command can be used to call some built-in diagnostic commands in vm. 
>> Can we consider extending it to the java layer like perf data, so that Java developers can 
>> customize their diagnostic commands and then call them through `jcmd`?
>> One application scenario I can think of for this extension is that some statistical information 
>> may be collected in a java application. Triggering the output of this statistical information through 
>> the `jcmd` command seems to me relative to other mechanisms that trigger output (such as through 
>> an HTTP service, or periodic Printing) is more convenient.
>> Any input is appreciated.
> If the intent is that you could issue a jcmd:
> jcmd <vmid> MyClass.foo
> to have it run/use a Java thread to execute arbitrary code then I 
> think a lot of careful consideration would need to be given to making 
> this facility safe and secure. I can easily imagine that the thread 
> used, and the timing, could cause failures. Executing arbitrary code 
> may be far too general, so it might mean we need a new "service" 
> interface defined that the target class has to implement.
> It might well be useful but will need some deep thought IMO.

If I understood correctly, the app would need to call an API like:

     JcmdProvider.register("mycmd1", new JcmdHandler() {
        public void handleCommand(String args[], PrintStream out) {
            out.print("my response is ");

       ... }

and then the user can issue:

     jcmd <pid> mycmd1 args .....

which will reach the handleCommand() method provided by the app.

- Ioi

> Cheers,
> David
>> Thanks,
>> Denghui Dong

More information about the hotspot-runtime-dev mailing list