새소식

반응형
Java

[Java] ForkJoinPool 에러 발생 in Java11

  • -
반응형

기존에 잘 동작하던 서비스의 java version을 upgrade시키고 난 이후에 에러가 발생하게 되었다.

java 8 -> java 11

 

버전 업 이후에 thread 개수가 너무 많이 증가하여 out of memory 발생

Caused by: java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits reached at java.base/java.lang.Thread.start0(Native Method) at java.base/java.lang.Thread.start(Unknown Source) at java.base/java.util.concurrent.ForkJoinPool.createWorker(Unknown Source) at java.base/java.util.concurrent.ForkJoinPool.tryCompensate(Unknown Source) at java.base/java.util.concurrent.ForkJoinPool.awaitJoin(Unknown Source) at java.base/java.util.concurrent.ForkJoinTask.doInvoke(Unknown Source) at java.base/java.util.concurrent.ForkJoinTask.invoke(Unknown Source) at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateParallel(Unknown Source) at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source) at java.base/java.util.stream.ReferencePipeline.collect(Unknown Source)

 

common thread pool을 사용하지 않고, custom thread pool을 생성

ForkJoinPool forkJoinPool = new ForkJoinPool(6); forkJoinPool.submit(() -> { integerList.parallelStream().forEach((integer) -> { ...}) }

 

다만, 명시적으로 forkjoinPool을 통해 생성된 thread를 반납하는 로직이 누락되어 있음

-> forkjoinPool.shutdown()

 

idle_timeout : 2초 

 

idle_timeout : 60초 

 

default idle_timeout에 대한 설정값의 변화로 OOM 발생 

 

명시적으로 forkjoinPool 리소스를 반납해 주자 

ForkJoinPool forkJoinPool = new ForkJoinPool(6); forkJoinPool.submit(() -> { integerList.parallelStream().forEach((integer) -> { ...}) } forkJoinPool.shutdown();

 

- https://kkang-joo.tistory.com/63

반응형

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.