새소식

반응형
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)

 

ForkjoinPool 사용 부분

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

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

 

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

-> forkjoinPool.shutdown()

 

java8

idle_timeout : 2초 

 

java11

idle_timeout : 60초 

 

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

 

해결법

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

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

 

기존에 작성한 ForkJoinPool 관련 정보 

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

반응형
Contents

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

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