ADDITIONAL SYSTEM INFORMATION :
Windows 11
A DESCRIPTION OF THE PROBLEM :
Calling com.sun.jdi.ThreadReference.threadGroups() on the "system" thread group as a debugged process is starting can cause the target VM to lock up. Threads don't appear to be waiting, the VM is just frozen. Attempting to attach VisualVM when in this state will cause VisualVM to freeze also. A thread dump on the target process does work. This only happens when there is a ClassPrepareRequest without certain exclusions, and only for some target programs. It may be timing-related, but it is consistent on my system and happens the same whether the debugger itself is running normally or is being debugged (debugger executing a debugger). Excluding various sets of Java library packages in the ClassPrepareRequest will avoid it. Calling any other JDI method doesn't seem to cause a problem.
By excluding the last ClassPrepareRequest class before the lock-up repeatedly, I found that the problem can be avoided by excluding: java.lang.ref.Cleaner$1 java.util.concurrent.ThreadFactory jdk.internal.ref.CleanerImpl$PhantomCleanableRef jdk.internal.ref.CleanerFactory$1 java.lang.ref.Cleaner
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Call com.sun.jdi.ThreadReference.threadGroups() from within debugger code when a ClassPrepareRequest is initiated in response to the first ThreadStartEvent (for the main thread).
A thread dump of the target and annotated event list from the debugger follow:
Thread dump of target:
Full thread dump OpenJDK 64-Bit Server VM (23.0.2+7-58 interpreted mode, sharing):
Threads class SMR info:
_java_thread_list=0x000001e24111a1b0, length=11, elements={
0x000001e252da03e0, 0x000001e241093390, 0x000001e241093df0, 0x000001e241096ac0,
0x000001e241097520, 0x000001e2410980b0, 0x000001e24109ab20, 0x000001e24110c5a0,
0x000001e24111ee10, 0x000001e241121960, 0x000001e24112a200
}
"main" #1 [6916] prio=5 os_prio=0 cpu=31.25ms elapsed=1831.55s tid=0x000001e252da03e0 nid=6916 runnable [0x000000862bdfd000]
java.lang.Thread.State: RUNNABLE
at jdk.internal.ref.CleanerFactory.<clinit>(java.base@23.0.2/CleanerFactory.java:40)
at java.io.FileCleanable.register(java.base@23.0.2/FileCleanable.java:77)
at java.io.FileInputStream.<init>(java.base@23.0.2/FileInputStream.java:160)
at jdk.internal.loader.URLClassPath$FileLoader$1.getInputStream(java.base@23.0.2/URLClassPath.java:1081)
at jdk.internal.loader.Resource.cachedInputStream(java.base@23.0.2/Resource.java:77)
- locked <0x00000004448935d8> (a jdk.internal.loader.URLClassPath$FileLoader$1)
at jdk.internal.loader.Resource.getByteBuffer(java.base@23.0.2/Resource.java:163)
at jdk.internal.loader.BuiltinClassLoader.defineClass(java.base@23.0.2/BuiltinClassLoader.java:853)
at jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(java.base@23.0.2/BuiltinClassLoader.java:760)
at jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(java.base@23.0.2/BuiltinClassLoader.java:681)
- locked <0x00000004448927d0> (a java.lang.Object)
at jdk.internal.loader.BuiltinClassLoader.loadClass(java.base@23.0.2/BuiltinClassLoader.java:639)
at jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(java.base@23.0.2/ClassLoaders.java:188)
at java.lang.ClassLoader.loadClass(java.base@23.0.2/ClassLoader.java:528)
at java.lang.Class.forName0(java.base@23.0.2/Native Method)
at java.lang.Class.forName(java.base@23.0.2/Class.java:578)
at java.lang.Class.forName(java.base@23.0.2/Class.java:557)
at sun.launcher.LauncherHelper.loadMainClass(java.base@23.0.2/LauncherHelper.java:847)
at sun.launcher.LauncherHelper.checkAndLoadMain(java.base@23.0.2/LauncherHelper.java:732)
Locked ownable synchronizers:
- None
"Reference Handler" #9 [8592] daemon prio=10 os_prio=2 cpu=0.00ms elapsed=1831.54s tid=0x000001e241093390 nid=8592 waiting on condition [0x000000862c5ff000]
java.lang.Thread.State: RUNNABLE
at java.lang.ref.Reference.waitForReferencePendingList(java.base@23.0.2/Native Method)
at java.lang.ref.Reference.processPendingReferences(java.base@23.0.2/Reference.java:246)
at java.lang.ref.Reference$ReferenceHandler.run(java.base@23.0.2/Reference.java:208)
Locked ownable synchronizers:
- None
"Finalizer" #10 [23604] daemon prio=8 os_prio=1 cpu=0.00ms elapsed=1831.54s tid=0x000001e241093df0 nid=23604 in Object.wait() [0x000000862c6ff000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait0(java.base@23.0.2/Native Method)
- waiting on <0x000000044480c100> (a java.lang.ref.NativeReferenceQueue$Lock)
at java.lang.Object.wait(java.base@23.0.2/Object.java:378)
at java.lang.Object.wait(java.base@23.0.2/Object.java:352)
at java.lang.ref.NativeReferenceQueue.await(java.base@23.0.2/NativeReferenceQueue.java:48)
at java.lang.ref.ReferenceQueue.remove0(java.base@23.0.2/ReferenceQueue.java:166)
at java.lang.ref.NativeReferenceQueue.remove(java.base@23.0.2/NativeReferenceQueue.java:89)
- locked <0x000000044480c100> (a java.lang.ref.NativeReferenceQueue$Lock)
at java.lang.ref.Finalizer$FinalizerThread.run(java.base@23.0.2/Finalizer.java:173)
Locked ownable synchronizers:
- None
"Signal Dispatcher" #11 [13164] daemon prio=9 os_prio=2 cpu=0.00ms elapsed=1831.54s tid=0x000001e241096ac0 nid=13164 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Attach Listener" #12 [9348] daemon prio=5 os_prio=2 cpu=0.00ms elapsed=1831.54s tid=0x000001e241097520 nid=9348 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Service Thread" #13 [5920] daemon prio=9 os_prio=0 cpu=109.38ms elapsed=1831.54s tid=0x000001e2410980b0 nid=5920 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Monitor Deflation Thread" #14 [11700] daemon prio=9 os_prio=0 cpu=359.38ms elapsed=1831.54s tid=0x000001e24109ab20 nid=11700 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"JDWP Transport Listener: dt_socket" #15 [8756] daemon prio=10 os_prio=0 cpu=0.00ms elapsed=1831.53s tid=0x000001e24110c5a0 nid=8756 runnable [0x000000862cbff000]
java.lang.Thread.State: RUNNABLE
at java.util.Arrays.copyOf(java.base@23.0.2/Arrays.java:3513)
at java.util.ArrayList.toArray(java.base@23.0.2/ArrayList.java:401)
at java.lang.ThreadGroup.subgroupsAsArray(java.base@23.0.2/ThreadGroup.java:751)
Locked ownable synchronizers:
- None
"JDWP Event Helper Thread" #16 [13564] daemon prio=10 os_prio=0 cpu=0.00ms elapsed=1831.53s tid=0x000001e24111ee10 nid=13564 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"JDWP Command Reader" #17 [15936] daemon prio=10 os_prio=0 cpu=15.62ms elapsed=1831.48s tid=0x000001e241121960 nid=15936 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Notification Thread" #18 [15932] daemon prio=9 os_prio=0 cpu=0.00ms elapsed=1831.40s tid=0x000001e24112a200 nid=15932 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"VM Thread" os_prio=2 cpu=15.62ms elapsed=1831.54s tid=0x000001e27577fa00 nid=24044 runnable
"VM Periodic Task Thread" os_prio=2 cpu=1625.00ms elapsed=1831.54s tid=0x000001e275769440 nid=14028 waiting on condition
"G1 Service" os_prio=2 cpu=156.25ms elapsed=1831.55s tid=0x000001e2756abaf0 nid=23896 runnable
"G1 Refine#0" os_prio=2 cpu=0.00ms elapsed=1831.55s tid=0x000001e2756aa1c0 nid=7948 runnable
"G1 Main Marker" os_prio=2 cpu=0.00ms elapsed=1831.55s tid=0x000001e2755d0600 nid=6412 runnable
"G1 Conc#0" os_prio=2 cpu=0.00ms elapsed=1831.55s tid=0x000001e2552ac010 nid=7468 runnable
"GC Thread#0" os_prio=2 cpu=0.00ms elapsed=1831.55s tid=0x000001e255297ae0 nid=1940 runnable
JNI global refs: 51, weak refs: 0
Debugger events:
--event: VMStartEvent in thread main
--event: ThreadStartEvent in thread main (ClassPrepareRequest is initiated while handling this event)
--event: ThreadStartEvent in thread Notification Thread
thread start ThreadStartEvent in thread Notification Thread
--event: ClassPrepareEvent in thread main
class prepare class sun.launcher.LauncherHelper (no class loader)
--event: ClassPrepareEvent in thread main
class prepare class java.nio.charset.CharsetDecoder (no class loader)
--event: ClassPrepareEvent in thread main
class prepare interface sun.nio.cs.ArrayDecoder (no class loader)
--event: ClassPrepareEvent in thread main
class prepare class sun.nio.cs.SingleByte$Decoder (no class loader)
--event: ClassPrepareEvent in thread main
class prepare class java.lang.StringCoding (no class loader)
--event: ClassPrepareEvent in thread main
class prepare class sun.net.util.URLUtil (no class loader)
--event: ClassPrepareEvent in thread main
class prepare interface java.security.PrivilegedExceptionAction (no class loader)
--event: ClassPrepareEvent in thread main
class prepare class jdk.internal.loader.URLClassPath$3 (no class loader)
--event: ClassPrepareEvent in thread main
class prepare class jdk.internal.loader.URLClassPath$Loader (no class loader)
--event: ClassPrepareEvent in thread main
class prepare class jdk.internal.loader.URLClassPath$FileLoader (no class loader)
--event: ClassPrepareEvent in thread main
class prepare class jdk.internal.loader.Resource (no class loader)
--event: ClassPrepareEvent in thread main
class prepare class jdk.internal.loader.URLClassPath$FileLoader$1 (no class loader)
--event: ClassPrepareEvent in thread main
class prepare interface java.lang.ref.Cleaner$Cleanable (no class loader)
--event: ClassPrepareEvent in thread main
class prepare class jdk.internal.ref.PhantomCleanable (no class loader)
--event: ClassPrepareEvent in thread main
class prepare class java.io.FileCleanable (no class loader)
--event: ClassPrepareEvent in thread main
class prepare class jdk.internal.ref.CleanerFactory (no class loader)
--event: ClassPrepareEvent in thread main
class prepare interface java.util.concurrent.ThreadFactory (no class loader)
After handling this event, the debugger waits forever for ThreadReference.threadGroups()
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Expect to get the thread groups.
ACTUAL -
The target VM locks up permanently.
---------- BEGIN SOURCE ----------
I can provide a version of our IDE and test code that will trigger the problem every time, if someone wants to investigate this. Please report to the JDI maintainers. I can't provide a simple test case, obviously.
---------- END SOURCE ----------
Windows 11
A DESCRIPTION OF THE PROBLEM :
Calling com.sun.jdi.ThreadReference.threadGroups() on the "system" thread group as a debugged process is starting can cause the target VM to lock up. Threads don't appear to be waiting, the VM is just frozen. Attempting to attach VisualVM when in this state will cause VisualVM to freeze also. A thread dump on the target process does work. This only happens when there is a ClassPrepareRequest without certain exclusions, and only for some target programs. It may be timing-related, but it is consistent on my system and happens the same whether the debugger itself is running normally or is being debugged (debugger executing a debugger). Excluding various sets of Java library packages in the ClassPrepareRequest will avoid it. Calling any other JDI method doesn't seem to cause a problem.
By excluding the last ClassPrepareRequest class before the lock-up repeatedly, I found that the problem can be avoided by excluding: java.lang.ref.Cleaner$1 java.util.concurrent.ThreadFactory jdk.internal.ref.CleanerImpl$PhantomCleanableRef jdk.internal.ref.CleanerFactory$1 java.lang.ref.Cleaner
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Call com.sun.jdi.ThreadReference.threadGroups() from within debugger code when a ClassPrepareRequest is initiated in response to the first ThreadStartEvent (for the main thread).
A thread dump of the target and annotated event list from the debugger follow:
Thread dump of target:
Full thread dump OpenJDK 64-Bit Server VM (23.0.2+7-58 interpreted mode, sharing):
Threads class SMR info:
_java_thread_list=0x000001e24111a1b0, length=11, elements={
0x000001e252da03e0, 0x000001e241093390, 0x000001e241093df0, 0x000001e241096ac0,
0x000001e241097520, 0x000001e2410980b0, 0x000001e24109ab20, 0x000001e24110c5a0,
0x000001e24111ee10, 0x000001e241121960, 0x000001e24112a200
}
"main" #1 [6916] prio=5 os_prio=0 cpu=31.25ms elapsed=1831.55s tid=0x000001e252da03e0 nid=6916 runnable [0x000000862bdfd000]
java.lang.Thread.State: RUNNABLE
at jdk.internal.ref.CleanerFactory.<clinit>(java.base@23.0.2/CleanerFactory.java:40)
at java.io.FileCleanable.register(java.base@23.0.2/FileCleanable.java:77)
at java.io.FileInputStream.<init>(java.base@23.0.2/FileInputStream.java:160)
at jdk.internal.loader.URLClassPath$FileLoader$1.getInputStream(java.base@23.0.2/URLClassPath.java:1081)
at jdk.internal.loader.Resource.cachedInputStream(java.base@23.0.2/Resource.java:77)
- locked <0x00000004448935d8> (a jdk.internal.loader.URLClassPath$FileLoader$1)
at jdk.internal.loader.Resource.getByteBuffer(java.base@23.0.2/Resource.java:163)
at jdk.internal.loader.BuiltinClassLoader.defineClass(java.base@23.0.2/BuiltinClassLoader.java:853)
at jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(java.base@23.0.2/BuiltinClassLoader.java:760)
at jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(java.base@23.0.2/BuiltinClassLoader.java:681)
- locked <0x00000004448927d0> (a java.lang.Object)
at jdk.internal.loader.BuiltinClassLoader.loadClass(java.base@23.0.2/BuiltinClassLoader.java:639)
at jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(java.base@23.0.2/ClassLoaders.java:188)
at java.lang.ClassLoader.loadClass(java.base@23.0.2/ClassLoader.java:528)
at java.lang.Class.forName0(java.base@23.0.2/Native Method)
at java.lang.Class.forName(java.base@23.0.2/Class.java:578)
at java.lang.Class.forName(java.base@23.0.2/Class.java:557)
at sun.launcher.LauncherHelper.loadMainClass(java.base@23.0.2/LauncherHelper.java:847)
at sun.launcher.LauncherHelper.checkAndLoadMain(java.base@23.0.2/LauncherHelper.java:732)
Locked ownable synchronizers:
- None
"Reference Handler" #9 [8592] daemon prio=10 os_prio=2 cpu=0.00ms elapsed=1831.54s tid=0x000001e241093390 nid=8592 waiting on condition [0x000000862c5ff000]
java.lang.Thread.State: RUNNABLE
at java.lang.ref.Reference.waitForReferencePendingList(java.base@23.0.2/Native Method)
at java.lang.ref.Reference.processPendingReferences(java.base@23.0.2/Reference.java:246)
at java.lang.ref.Reference$ReferenceHandler.run(java.base@23.0.2/Reference.java:208)
Locked ownable synchronizers:
- None
"Finalizer" #10 [23604] daemon prio=8 os_prio=1 cpu=0.00ms elapsed=1831.54s tid=0x000001e241093df0 nid=23604 in Object.wait() [0x000000862c6ff000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait0(java.base@23.0.2/Native Method)
- waiting on <0x000000044480c100> (a java.lang.ref.NativeReferenceQueue$Lock)
at java.lang.Object.wait(java.base@23.0.2/Object.java:378)
at java.lang.Object.wait(java.base@23.0.2/Object.java:352)
at java.lang.ref.NativeReferenceQueue.await(java.base@23.0.2/NativeReferenceQueue.java:48)
at java.lang.ref.ReferenceQueue.remove0(java.base@23.0.2/ReferenceQueue.java:166)
at java.lang.ref.NativeReferenceQueue.remove(java.base@23.0.2/NativeReferenceQueue.java:89)
- locked <0x000000044480c100> (a java.lang.ref.NativeReferenceQueue$Lock)
at java.lang.ref.Finalizer$FinalizerThread.run(java.base@23.0.2/Finalizer.java:173)
Locked ownable synchronizers:
- None
"Signal Dispatcher" #11 [13164] daemon prio=9 os_prio=2 cpu=0.00ms elapsed=1831.54s tid=0x000001e241096ac0 nid=13164 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Attach Listener" #12 [9348] daemon prio=5 os_prio=2 cpu=0.00ms elapsed=1831.54s tid=0x000001e241097520 nid=9348 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Service Thread" #13 [5920] daemon prio=9 os_prio=0 cpu=109.38ms elapsed=1831.54s tid=0x000001e2410980b0 nid=5920 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Monitor Deflation Thread" #14 [11700] daemon prio=9 os_prio=0 cpu=359.38ms elapsed=1831.54s tid=0x000001e24109ab20 nid=11700 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"JDWP Transport Listener: dt_socket" #15 [8756] daemon prio=10 os_prio=0 cpu=0.00ms elapsed=1831.53s tid=0x000001e24110c5a0 nid=8756 runnable [0x000000862cbff000]
java.lang.Thread.State: RUNNABLE
at java.util.Arrays.copyOf(java.base@23.0.2/Arrays.java:3513)
at java.util.ArrayList.toArray(java.base@23.0.2/ArrayList.java:401)
at java.lang.ThreadGroup.subgroupsAsArray(java.base@23.0.2/ThreadGroup.java:751)
Locked ownable synchronizers:
- None
"JDWP Event Helper Thread" #16 [13564] daemon prio=10 os_prio=0 cpu=0.00ms elapsed=1831.53s tid=0x000001e24111ee10 nid=13564 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"JDWP Command Reader" #17 [15936] daemon prio=10 os_prio=0 cpu=15.62ms elapsed=1831.48s tid=0x000001e241121960 nid=15936 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Notification Thread" #18 [15932] daemon prio=9 os_prio=0 cpu=0.00ms elapsed=1831.40s tid=0x000001e24112a200 nid=15932 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"VM Thread" os_prio=2 cpu=15.62ms elapsed=1831.54s tid=0x000001e27577fa00 nid=24044 runnable
"VM Periodic Task Thread" os_prio=2 cpu=1625.00ms elapsed=1831.54s tid=0x000001e275769440 nid=14028 waiting on condition
"G1 Service" os_prio=2 cpu=156.25ms elapsed=1831.55s tid=0x000001e2756abaf0 nid=23896 runnable
"G1 Refine#0" os_prio=2 cpu=0.00ms elapsed=1831.55s tid=0x000001e2756aa1c0 nid=7948 runnable
"G1 Main Marker" os_prio=2 cpu=0.00ms elapsed=1831.55s tid=0x000001e2755d0600 nid=6412 runnable
"G1 Conc#0" os_prio=2 cpu=0.00ms elapsed=1831.55s tid=0x000001e2552ac010 nid=7468 runnable
"GC Thread#0" os_prio=2 cpu=0.00ms elapsed=1831.55s tid=0x000001e255297ae0 nid=1940 runnable
JNI global refs: 51, weak refs: 0
Debugger events:
--event: VMStartEvent in thread main
--event: ThreadStartEvent in thread main (ClassPrepareRequest is initiated while handling this event)
--event: ThreadStartEvent in thread Notification Thread
thread start ThreadStartEvent in thread Notification Thread
--event: ClassPrepareEvent in thread main
class prepare class sun.launcher.LauncherHelper (no class loader)
--event: ClassPrepareEvent in thread main
class prepare class java.nio.charset.CharsetDecoder (no class loader)
--event: ClassPrepareEvent in thread main
class prepare interface sun.nio.cs.ArrayDecoder (no class loader)
--event: ClassPrepareEvent in thread main
class prepare class sun.nio.cs.SingleByte$Decoder (no class loader)
--event: ClassPrepareEvent in thread main
class prepare class java.lang.StringCoding (no class loader)
--event: ClassPrepareEvent in thread main
class prepare class sun.net.util.URLUtil (no class loader)
--event: ClassPrepareEvent in thread main
class prepare interface java.security.PrivilegedExceptionAction (no class loader)
--event: ClassPrepareEvent in thread main
class prepare class jdk.internal.loader.URLClassPath$3 (no class loader)
--event: ClassPrepareEvent in thread main
class prepare class jdk.internal.loader.URLClassPath$Loader (no class loader)
--event: ClassPrepareEvent in thread main
class prepare class jdk.internal.loader.URLClassPath$FileLoader (no class loader)
--event: ClassPrepareEvent in thread main
class prepare class jdk.internal.loader.Resource (no class loader)
--event: ClassPrepareEvent in thread main
class prepare class jdk.internal.loader.URLClassPath$FileLoader$1 (no class loader)
--event: ClassPrepareEvent in thread main
class prepare interface java.lang.ref.Cleaner$Cleanable (no class loader)
--event: ClassPrepareEvent in thread main
class prepare class jdk.internal.ref.PhantomCleanable (no class loader)
--event: ClassPrepareEvent in thread main
class prepare class java.io.FileCleanable (no class loader)
--event: ClassPrepareEvent in thread main
class prepare class jdk.internal.ref.CleanerFactory (no class loader)
--event: ClassPrepareEvent in thread main
class prepare interface java.util.concurrent.ThreadFactory (no class loader)
After handling this event, the debugger waits forever for ThreadReference.threadGroups()
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Expect to get the thread groups.
ACTUAL -
The target VM locks up permanently.
---------- BEGIN SOURCE ----------
I can provide a version of our IDE and test code that will trigger the problem every time, if someone wants to investigate this. Please report to the JDI maintainers. I can't provide a simple test case, obviously.
---------- END SOURCE ----------
- relates to
-
JDK-8352773 JVMTI should disable events during java upcalls
-
- Open
-
-
JDK-8296492 Remove ObjectLocker in JVMTI get_subgroups call
-
- Resolved
-
- links to
-
Review(master) openjdk/jdk/24236