RFR: 8303242: ThreadMXBean issues with virtual threads [v3]

Mandy Chung mchung at openjdk.org
Wed Mar 1 21:50:17 UTC 2023


On Wed, 1 Mar 2023 12:39:52 GMT, Alan Bateman <alanb at 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. It also fixes ThreadMXBean.getCurrentThreadCpuTime and getCurrentThreadUserTime to not throw UOE when CPU time measurement from a platform thread is supported. There are some small 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.
>
> Alan Bateman has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Update isXXXThreadCpuTimeSupported descriptions

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

> 477:      * if the thread of the specified ID exists, the thread is alive,
> 478:      * and CPU time measurement is enabled; {@code -1} if not enabled
> 479:      * or the specified ID is a virtual thread

It should be "{@code -1} if not enabled or the specified ID is a virtual thread or the thread does not exist or not alive."

Would this be simpler:


     * @return the total CPU time for a thread of the specified ID
     * if the thread of the specified ID is a platform thread, the thread is alive,
     * and CPU time measurement is enabled; {@code -1} otherwise.


I'm fine with either way.  Same comment for `getThreadUserTime(long)`

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

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


More information about the serviceability-dev mailing list