Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8307401

get rid of compatibility ThreadStart/ThreadEnd events for virtual threads

XMLWordPrintable

    • Icon: CSR CSR
    • Resolution: Approved
    • Icon: P4 P4
    • 21
    • hotspot
    • None
    • behavioral
    • low
    • Hide
      The compatibility risk is low.
      The existing agents are expected to enable the can_support_virtual_threads capability and manage the VirtualThreadStart/VirtualThreadEnd events for virtual threads separately from the ThreadStart/ThreadEnd events for platform threads. A small number of old JVMTI agents that still expect to get all ThreadStart/ThreadEnd events won’t get them for virtual threads. We must document that they will need to upgrade and add support for virtual threads to get the VirtualThreadStart/VirtualThreadEnd events for virtual threads.
      Show
      The compatibility risk is low. The existing agents are expected to enable the can_support_virtual_threads capability and manage the VirtualThreadStart/VirtualThreadEnd events for virtual threads separately from the ThreadStart/ThreadEnd events for platform threads. A small number of old JVMTI agents that still expect to get all ThreadStart/ThreadEnd events won’t get them for virtual threads. We must document that they will need to upgrade and add support for virtual threads to get the VirtualThreadStart/VirtualThreadEnd events for virtual threads.
    • Other
    • SE

      Summary

      Change the JVM TI ThreadStart/ThreadEnd events so they are only sent for platform threads. Agents that wish to get events when virtual Threads start or end can enable the VirtualThreadStart/VirtualThreadEnd events.

      Problem

      It is possible to create much more virtual threads than platform threads as they are light wight. In such cases the execution of ThreadStart/ThreadEnd event callbacks will give a significant performance overhead. To overcome this potential problem the VirtualThreadStart/VirtualThreadEnd events for virtual trheads can be enabled/disabled separately from the ThreadStart/ThreadEnd events for platform threads. The can_support_virtual_threads has to be enabled for that. If this capability is disabled then the ThreadStart/ThreadEnd events will be generated for virtual threads as well as for platform threads. This was for compatibility with old/legacy JVMTI agents which were not upgraded to support virtual threads. The problem with this is that there can still can be a unexpectedly big performance overhead when profiled applications create a lot of virtual threads.

      Solution

      The solution is to get rid of the compatibility ThreadStart/ThreadEnd events for virtual threads when the can_support_virtual_threads capability is disabled. The existing agents are expected to be upgraded to support virtual threads and enable the can_support_virtual_threads capability if they need to be notified about virtual threads creation and termination.

      Specification

      There are the following changes in the JVMTI spec:

      • ThreadStart event spec:

      Replace the fragment:

      This event is generated by platform threads. It is also generated by
      `virtual threads when the capability `can_support_virtual_threads`
      `can_support_virtual_threads` is not enabled. Agents without support
      for virtual threads that enable this event will therefore be notified by all
      newly started threads. If the capability `can_support_virtual_threads` is
      enabled then this event is not generated by virtual threads.
      Agents with support for virtual threads can enable `VirtualThreadStart`
      to be notified by newly started virtual threads.

      with the fragment:

      This event is generated by platform thread. It is not generated by virtual threads.
      Agents with the `can_support_virtual_threads` capability can enable the
      VirtualThreadStart event to be notified by newly started virtual threads.
      • ThreadEnd event spec:

      Replace the fragment:

      This event is generated by platform threads. It is also generated by
      `virtual threads when the capability `can_support_virtual_threads`
      `can_support_virtual_threads` is not enabled. Agents without support for
      virtual threads that enable this event for all threads will therefore be notified
      by all terminating threads. If the capability `can_support_virtual_threads` is
      enabled then this event is not generated by virtual threads.
      Agents with support for virtual threads can enable `VirtualThreadEnd`
      to be notified by terminating virtual threads.

      with the fragment:

      This event is generated by platform thread. It is not generated by virtual threads.
      Agents with the `can_support_virtual_threads` capability can enable the
      VirtualThreadEnd event to be notified by newly started virtual threads.

      The jvmti.xml update is:

      diff --git a/src/hotspot/share/prims/jvmti.xml b/src/hotspot/share/prims/jvmti.xml
      index 456876fbcb9..546b45ac86e 100644
      --- a/src/hotspot/share/prims/jvmti.xml
      +++ b/src/hotspot/share/prims/jvmti.xml
      @@ -12937,16 +12940,10 @@ myInit() {
             A thread start event is generated by a new thread before its initial
             method executes.
             <p/>
      -      This event is generated by platform threads. It is also generated by
      -      virtual threads when the capability
      -      <internallink id="jvmtiCapabilities.can_support_virtual_threads">
      -      <code>can_support_virtual_threads</code></internallink> is not enabled.
      -      Agents without support for virtual threads that enable this event will
      -      therefore be notified by all newly started threads.
      +      This event is generated by platform thread. It is not generated by virtual threads.
             <p/>
      -      If the capability <code>can_support_virtual_threads</code> is enabled then
      -      this event is not generated by virtual threads. Agents with support for
      -      virtual threads can enable <eventlink id="VirtualThreadStart"></eventlink>
      +      Agents with the <code>can_support_virtual_threads</code> capability
      +      can enable the <eventlink id="VirtualThreadStart"></eventlink> event
             to be notified by newly started virtual threads.
             <p/>
             A platform thread may be listed in the array returned by
      @@ -12984,16 +12981,10 @@ myInit() {
             A thread end event is generated by a terminating thread after its
             initial method has finished execution.
             <p/>
      -      This event is generated by platform threads. It is also generated by
      -      virtual threads when the capability
      -      <internallink id="jvmtiCapabilities.can_support_virtual_threads">
      -      <code>can_support_virtual_threads</code></internallink> is not enabled.
      -      Agents without support for virtual threads that enable this event for
      -      all threads will therefore be notified by all terminating threads.
      +      This event is generated by platform thread. It is not generated by virtual threads.
             <p/>
      -      If the capability <code>can_support_virtual_threads</code> is enabled then
      -      this event is not generated by virtual threads. Agents with support for
      -      virtual threads can enable <eventlink id="VirtualThreadEnd"></eventlink>
      +      Agents with the <code>can_support_virtual_threads</code> capability
      +      can enable the <eventlink id="VirtualThreadSEnd"></eventlink> event
             to be notified by terminating virtual threads.
             <p/>
             A platform thread may be listed in the array returned by

            sspitsyn Serguei Spitsyn
            sspitsyn Serguei Spitsyn
            Alan Bateman
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: