[java] 느린 첫 번째 호출을 피하기 위해 Java 클래스를 예열하는 방법은 무엇입니까?

모든 API 호출이 1 초 미만이어야하는 프로젝트를 수행하고 있지만 다음 경로보다 느린 각 경로에 대한 첫 번째 호출에 문제가 있습니다.

현재 / login에 대한 첫 번째 호출은 3.6 초가 걸리고 다음 호출은 다른 모든 경로에 대해 170ms가 걸립니다.

-XX:+TraceClassLoading첫 번째 호출에서이를 사용하여 클래스가 메모리에로드되어 성능 문제가 발생한다는 것을 알았습니다 .

그러나 시작할 때 모든 클래스를 쉽게로드 할 수있는 방법을 찾지 못했고 새로운 서비스마다 ApplicationRunner에서 워밍업 호출을 추가해야합니다.

누구나 SpringBoot 응용 프로그램의 클래스를 자동으로로드하거나 모든 경로를 예열하는 솔루션이 있습니까?



답변

자바의 클래스 로딩은 게으르다. 이것은 클래스가 필요할 때 그리고 필요할 때만 JVM에 의해로드된다는 것을 의미합니다.

클래스를 열심히로드하도록 강요하려면 클래스를 참조하면됩니다. 이를 수행하는 한 가지 방법은 jar 컨텐츠 또는 클래스 파일을 반복하여 클래스 이름을 얻은 다음이를 사용하여 호출하는 것 Class.forName(className)입니다.

또한 시작 시간과 성능이 사용 사례에 매우 중요한 경우 GraalVM 과 같은 사전 컴파일 솔루션을 살펴 보거나 JIT의 컴파일 임계 값을 줄이려고 할 수 있습니다 ( -XX:CompileThreshold).


답변

나에게 유일하게 가능한 옵션은 JEP 310 , JEP 341JEP 350에class data sharing 퍼져 있지만 java-13이 가장 필요할 것입니다. 우리는 이것을 내 작업장 (대부분은 거짓말을하지 않고 재미를 위해)에서 내부적으로 테스트하고 있으며 결과는 지금까지는 좋아 보입니다.

다른 옵션은 애플리케이션이 시작될 때 엔드 포인트를 호출하는 것입니다 (옵션 인 경우). 다시, 이다 예를 들어 우리를 위해 우리가 코드를 따뜻하게 더미 데이터로의 수백 배의 몇 가지를 호출합니다. 그러나 동시에 우리는 이것이 불가능한 서비스를 제공하고 CDS있습니다.


답변