loom的jtreg测试VirtualThreadPinnedEventThrows.java无法移植到KonaFiber-8的原因分析 #130
ywj0101
started this conversation in
Show and tell
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
VirtualThreadPinnedEventThrows.java 代码分析
源码链接:https://github.com/openjdk/loom/blob/bf5d8122254115c81f026aff8fe882c22612feb5/test/jdk/java/lang/Thread/virtual/VirtualThreadPinnedEventThrows.java
jtreg 的 test description 说明
关于这个描述,重要的地方在与
@compile/module=java.base jdk/internal/event/VirtualThreadPinnedEvent.java
。表示执行该jtreg测试时,会优先编译java.base中jdk/internal/event/VirtualThreadPinnedEvent.java,及代码(https://github.com/openjdk/loom/blob/bf5d8122254115c81f026aff8fe882c22612feb5/test/jdk/java/lang/Thread/virtual/java.base/jdk/internal/event/VirtualThreadPinnedEvent.java )。因此在执行测试时,如果调用 VirtualThreadPinnedEvent 中的方法时,会调用该文件中的方法,而不是JDK中默认的 VirtualThreadPinnedEvent.java(在jdk22中位于jdk.internal.event
包下)。核心方法 testParkWhenPinned 分析
该方法主要用于触发 VirtualThreadPinnedEvent,在虚拟线程中,需要满足两个触发条件
synchronized (lock)
实现在触发 VirtualThreadPinnedEvent 后,唤醒虚拟线程,等待执行完毕。代码执行期间对虚拟线程的状态以及 completed 变量进行了断言
测试方法分析
总共有三个Test,每个 Test 都是为了测试 VirtualThreadPinnedEvent 触发失败,只是失败的阶段不同,分别是 VirtualThreadPinnedEvent 的 create、begin、commit阶段。
测试可能存在的缺陷
在 testParkWhenPinned 方法中,无法证明 VirtualThreadPinnedEvent 是否因为 OOME 而触发失败,因为在jdk22中,VirtualThread中已经捕获了OutOfMemoryError,见下面代码
对测试的改进
因为OOME已经在 VirtualThread 中的 parkOnCarrierThread 方法捕获,并且将 event 设置为空,所以无法收集到 VirtualThreadPinnedEvent ,从而证明抛出了OOME,对 testParkWhenPinned 方法修改如下:
使用 JFR 收集
jdk.VirtualThreadPinned
是否发生,通过assertEquals(0, virtualThreadPinnedEventCount);
断言收集不到该事件测试移植至kona失败的原因分析
JDK22 和kona 8中对虚拟线程触发的事件定义方式不同。在jdk22中 VirtualThreadPinnedEvent 的类被映射到 jdk.internal.event.VirtualThreadPinnedEvent 位置,代码如下
而在kona 8 中,该 VirtualThreadPinnedEvent 被写死,无法对VirtualThreadPinnedEvent进行修改,代码如下
因此无法移植。
Beta Was this translation helpful? Give feedback.
All reactions