Trabajo en una aplicación web de Jetty que se ejecutaba en Java 16. Traté de actualizarla a Java 17, pero hubo problemas de rendimiento críticos causados en su totalidad por una llamada a parallelStream() .
Los únicos cambios son el aumento de la versión de Java de 16 a 17, --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED y el aumento de tiempo de ejecución de openjdk:16.0.1-jdk-oraclelinux8 a openjdk:17.0.1-jdk-oraclelinux8 .
Logramos obtener un volcado de subprocesos y contiene muchos de estos:
"qtp1368594774-200" #200 prio=5 os_prio=0 cpu=475.94ms elapsed=7189.65s tid=0x00007fd49c50cc10 nid=0xd1 waiting on condition [0x00007fd48fef7000] java.lang.Thread.State: WAITING (parking) at jdk.internal.misc.Unsafe.park(java.base@17.0.1/Native Method) - parking to wait for <0x00000007b73439a8> (a java.util.stream.ReduceOps$ReduceTask) at java.util.concurrent.locks.LockSupport.park(java.base@17.0.1/LockSupport.java:341) at java.util.concurrent.ForkJoinTask.awaitDone(java.base@17.0.1/ForkJoinTask.java:468) at java.util.concurrent.ForkJoinTask.invoke(java.base@17.0.1/ForkJoinTask.java:687) at java.util.stream.ReduceOps$ReduceOp.evaluateParallel(java.base@17.0.1/ReduceOps.java:927) at java.util.stream.AbstractPipeline.evaluate(java.base@17.0.1/AbstractPipeline.java:233) at java.util.stream.ReferencePipeline.collect(java.base@17.0.1/ReferencePipeline.java:682) at com.stackoverflowexample.aMethodThatDoesBlockingIOUsingParallelStream()El código que está causando el problema es algo como:
list.parallelStream() .map(this::callRestServiceToGetSomeData) .collect(Collectors.toUnmodifiableList()); Esta imagen muestra el uso de subprocesos antes de actualizar desde jdk16 (LHS), actualizar a jdk17 (el gran pico en el medio) y luego eliminar la llamada a parallelStream() aún en jdk17 (RHS):
¿Qué cambio en Java 17 (openjdk-17.0.1_linux-x64_bin.tar.gz) ha causado esto?