On Mon, 27 Feb 2023 12:23:09 GMT, Alan Bateman <al...@openjdk.org> wrote:

> This PR covers a number of issues with j.l.management.ThreadMXBean, and the 
> JDK-specific extension c.s.management.ThreadMXBean, when there are virtual 
> threads in use.
> 
> As background, ThreadMXBean was re-specified in Java 19 to support the 
> monitoring and management of platform threads. It does not support virtual 
> threads as their potential number, and the need to find a thread by id, does 
> not make sense for this API. At the same time, JDK 19 introduced an 
> alternative implementation of virtual threads for Zero and ports without 
> continuations support in the VM. This alternative implementation of virtual 
> threads means a JavaThread per virtual thread and so requires filtering to 
> ensure that the API behaves as specified. For the initial implementation, the 
> filtering was done in the ThreadMXBean implementation. That works for most 
> functions but not for getThreadXXXTime(long[]) and 
> getThreadAllocatedBytes(long[]) where the filtering needs to be pushed down 
> to the management code.
> 
> The changes in this PR move the filtering to the management functions 
> (jmm_XXX) so they only return information about platform threads. There are 
> some minor adjustments to the API docs (see linked CSR). Test coverage is 
> expanded as we didn't include tests for c.s.management.ThreadMXBean with 
> virtual threads in JDK 19.
> 
> Testing tier1-3 (jdk_management test group is in test/jdk/:tier3), plus 
> sanity checking that --with-jvm-variants=minimal builds as some of this code 
> is not compiled in with minimal VM builds.

The "Thread CPU time" section in the class spec of ThreadMXBean can also be 
clarified.

src/java.management/share/classes/java/lang/management/ThreadMXBean.java line 
529:

> 527:     /**
> 528:      * Tests if the Java virtual machine implementation supports CPU time
> 529:      * measurement for any platform thread.

This change can also apply in `@return` (line 538)

test/jdk/java/lang/management/ThreadMXBean/VirtualThreads.java line 258:

> 256:             long tid = Thread.currentThread().threadId();
> 257:             long cpuTime = bean.getThreadCpuTime(tid);
> 258:             assertEquals(-1L, cpuTime);

Am I correct that `getThreadCpuTime(tid)` returns -1 for the current thread is 
a virtual thread whereas `getCurrentThreadCpuTime` throws UOE in the current 
implementation?

`getCurrentThreadCpuTime` is specified to be equivalent to calling 
`getThreadCpuTime(Thread.currentThread().threadId()`.

-------------

PR: https://git.openjdk.org/jdk/pull/12762

Reply via email to