Распаковщик Java 22.0.2 VirtualThread кажется припаркованным навсегдаJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Распаковщик Java 22.0.2 VirtualThread кажется припаркованным навсегда

Сообщение Anonymous »

Когда я использую следующий пул потоков с большой нагрузкой.
private final ScheduledExecutorService serverExecutor2 = Executors.newScheduledThreadPool(2000, Thread.ofVirtual().name("COAP-SERVER2-", 0).factory());
Кажется, оно застряло:
serverExecutor2=@ScheduledThreadPoolExecutor[java.util.concurrent.ScheduledThreadPoolExecutor@327e5be5[Running, pool size = 2000, active threads = 0, queued tasks = 60000, completed tasks = 97847]],
Все соответствующие виртуальные потоки паркуются:
#75 "COAP-SERVER2-5" virtual
java.base/java.lang.VirtualThread.park(VirtualThread.java:592)
java.base/java.lang.System$2.parkVirtualThread(System.java:2639)
java.base/jdk.internal.misc.VirtualThreads.park(VirtualThreads.java:54)
java.base/java.util.concurrent.locks.LockSupport.park(LockSupport.java:369)
java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:519)
java.base/java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3780)
java.base/java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3725)
java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1707)
java.base/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1177)
java.base/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:899)
java.base/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1070)
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
java.base/java.lang.VirtualThread.run(VirtualThread.java:311)

Похоже, это вызвано блокировкой VirtualThread-unparker, пока его ожидает множество задач:
"VirtualThread-unparker" #92 [593799] daemon prio=5 os_prio=0 cpu=2238.28ms elapsed=373.27s tid=0x00007f1b3002fd50 nid=593799 waiting on condition [0x00007f1e6db43000]
java.lang.Thread.State: TIMED_WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base@22.0.2/Native Method)
- parking to wait for (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.parkNanos(java.base@22.0.2/LockSupport.java:269)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(java.base@22.0.2/AbstractQueuedSynchronizer.java:1758)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@22.0.2/ScheduledThreadPoolExecutor.java:1182)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@22.0.2/ScheduledThreadPoolExecutor.java:899)
at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@22.0.2/ThreadPoolExecutor.java:1070)
at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@22.0.2/ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@22.0.2/ThreadPoolExecutor.java:642)
at java.lang.Thread.runWith(java.base@22.0.2/Thread.java:1583)
at java.lang.Thread.run(java.base@22.0.2/Thread.java:1570)
at jdk.internal.misc.InnocuousThread.run(java.base@22.0.2/InnocuousThread.java:186)

Locked ownable synchronizers:
- None

Я использовал инструмент отладки, чтобы получить очередь unparker. очевидно, что задача в начале очереди должна была быть запущена уже давно (время 84137649857516, а текущее время 84707647860354):
[arthas@593599]$ ognl '@java.lang.VirtualThread@UNPARKER.toString()'
@String[java.util.concurrent.ScheduledThreadPoolExecutor@154b1210[Running, pool size = 1, active threads = 0, queued tasks = 30027, completed tasks = 413674]]
[arthas@593599]$ ognl '@System@nanoTime()'
@Long[84707647860354]
[arthas@593599]$ ognl '@java.lang.VirtualThread@UNPARKER.queue.peek()'
@ScheduledFutureTask[
sequenceNumber=@Long[1227676],
time=**@Long[84137649857516]**,
period=@Long[0],
outerTask=@ScheduledFutureTask[java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask@5d021eb6[Not completed, task = java.util.concurrent.Executors$RunnableAdapter@7d5f12fb[Wrapped task = java.lang.VirtualThread$$Lambda/0x00007f1bf357cc70@56d5ca23]]],
heapIndex=@Integer[0],
this$0=@ScheduledThreadPoolExecutor[java.util.concurrent.ScheduledThreadPoolExecutor@154b1210[Running, pool size = 1, active threads = 0, queued tasks = 30027, completed tasks = 413674]],
state=@Integer[0],
NEW=@Integer[0],
COMPLETING=@Integer[1],
NORMAL=@Integer[2],
EXCEPTIONAL=@Integer[3],
CANCELLED=@Integer[4],
INTERRUPTING=@Integer[5],
INTERRUPTED=@Integer[6],
callable=@RunnableAdapter[java.util.concurrent.Executors$RunnableAdapter@7d5f12fb[Wrapped task = java.lang.VirtualThread$$Lambda/0x00007f1bf357cc70@56d5ca23]],
outcome=null,
runner=null,
waiters=null,
STATE=@FieldInstanceReadWrite[VarHandle[varType=int, coord=[class java.util.concurrent.FutureTask]]],
RUNNER=@FieldInstanceReadWrite[VarHandle[varType=java.lang.Thread, coord=[class java.util.concurrent.FutureTask]]],
WAITERS=@FieldInstanceReadWrite[VarHandle[varType=java.util.concurrent.FutureTask$WaitNode, coord=[class java.util.concurrent.FutureTask]]],

Я делаю что-то не так или это ошибка jdk или ОС?
---- обновление ----
Я обнаружил, что при использовании DatagramChannel для получения пакета время срабатывания scheudleTask может быть отрицательным:
ts=2024-08-06 14:32:36;thread_name=ForkJoinPool-1-worker-1;id=97;is_daemon=true;priority=5;TCCL=jdk.internal.loader.ClassLoaders$AppClassLoader@5c647e05
@java.util.concurrent.ScheduledThreadPoolExecutor.triggerTime() -- get a number close to Long.MAX_VALUE as param and output nagative number.
at java.util.concurrent.ScheduledThreadPoolExecutor.schedule(ScheduledThreadPoolExecutor.java:560)
at java.lang.VirtualThread.scheduleUnpark(VirtualThread.java:705)
at java.lang.VirtualThread.parkNanos(VirtualThread.java:632)
at java.lang.System$2.parkVirtualThread(System.java:2652)
at jdk.internal.misc.VirtualThreads.park(VirtualThreads.java:67)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:408)
at sun.nio.ch.Poller.pollIndirect(Poller.java:137)
at sun.nio.ch.Poller.poll(Poller.java:102)
at sun.nio.ch.Poller.poll(Poller.java:87)
at sun.nio.ch.DatagramChannelImpl.park(DatagramChannelImpl.java:494)
at sun.nio.ch.DatagramChannelImpl.tryBlockingReceive(DatagramChannelImpl.java:762)
at sun.nio.ch.DatagramChannelImpl.blockingReceive(DatagramChannelImpl.java:692) ---- if nanos is zero, nanos = Long.MAX_VALUE, which caused overflow at ScheduledThreadPoolExecutor.schedule
at sun.nio.ch.DatagramSocketAdaptor.receive(DatagramSocketAdaptor.java:204)
at java.net.DatagramSocket.receive(DatagramSocket.java:714)


Подробнее здесь: https://stackoverflow.com/questions/788 ... ed-forever
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»