programing

Spring 통합 테스트는 많은 메모리를 소비하고 GradleWorkerMain에서 많은 수의 중복 스레드를 사용합니다.

i4 2023. 7. 30. 17:04
반응형

Spring 통합 테스트는 많은 메모리를 소비하고 GradleWorkerMain에서 많은 수의 중복 스레드를 사용합니다.

저는 테스트가 많은 다소 복잡한 Spring Boot 앱을 가지고 있습니다.

테스트를 실행할 때 많은 스레드가 축적되는 것으로 보이며, 그 중 하나는 여러 인스턴스가 있으며 이를SimplePauseDetectorThread_0내가 추적한 것은 이 의존성 때문입니다.

|    |    |    \--- io.micrometer:micrometer-core:1.1.1
|    |    |         +--- org.latencyutils:LatencyUtils:2.0.3

이 문제는 2.1.1과 마찬가지로 Spring Boot 2.0.6에서도 발생하는 것으로 보입니다.

일반적인 테스트는 다음과 같습니다.

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@ActiveProfiles(profiles = {"test"})
public class MyTest {
[...]

내 액추에이터 구성은 다음과 같습니다.

management.endpoints.enabled-by-default=false
management.endpoint.prometheus.enabled=true
management.endpoints.web.base-path=/
management.endpoints.web.exposure.include=prometheus
management.endpoints.web.path-mapping.prometheus=prometheus
spring.metrics.prometheus.enabled=true

첨부된 스크린샷 참조

enter image description here

Pivotal의 Snicoll은 GitHub가 봄 부팅 테스트 프레임워크의 컨텍스트 캐슁에 연결되어 있다고 제안하여 GitHub에 대한 지원을 받았습니다.

스프링 통합을 사용하는 테스트가 많고 컨텍스트 구성이 다소 중요한 경우(클래스 하나만 표시), 구성당 컨텍스트가 하나씩 생성되고 해당 시나리오에서 스레드 수가 증가하는 것을 확인할 수 있습니다.

그런 다음 그는 다음과 같은 관련 문서를 가리켰습니다.

spring.test.context.cache.maxSize라는 JVM 시스템 속성을 설정하여 명령줄 또는 빌드 스크립트에서 최대 크기를 구성할 수 있습니다.또는 SpringProperties API를 사용하여 동일한 속성을 프로그래밍 방식으로 설정할 수 있습니다.

그리고.org.springframework.core.SpringProperties상태:

Reads a {@code spring.properties} file from the root of the Spring library classpath

그럼 두 가지 방법으로 설정할 수 있는 건maxSize.

옵션 1.Gradle 테스트 작업 구성

그라들에 속성 추가test를 구성할 태스크GradleWorkerMainbuild.gradle:

test {
    jvmArgs "-Dspring.test.context.cache.maxSize=1"
}

하위 프로젝트가 많은 경우 이 옵션을 사용할 수 있습니다.

이 설정을 모든 하위 프로젝트에 적용하는 방법은 아래의 보너스를 참조하십시오.

옵션 2.spring.properties를 테스트 리소스에 추가합니다.

다음에 설정을 쓸 수 있습니다.my-service/src/test/resources/spring.properties이와 같이:

spring.test.context.cache.maxSize=1

결론

이제 테스트는 메모리 소비와 스레드 수를 줄이면서 잘 실행되고 있습니다.

보너스

이는 또한 Gradle 5+가 시스템 RAM의 25% 대신 기본적으로 512MB의 최대 힙을 가진 작업자를 보유하는 문제를 해결합니다. 하위 프로젝트 테스트 제품군은 더 이상 사용 가능한 RAM을 모두 제거하지 않으므로 더 큰 힙을 가진 사용자 지정 jvmargs를 추가하지 않으면 작업자가 OOM 상태가 됩니다.test의성의 .java에서 "할 수 .이제 그라들 워커에서 "vanilla" 힙 크기로 실행할 수 있습니다.

Gradle 테스트에 사용할 수 있는 RAM을 조정하려면 루트에서 이와 같은 작업을 수행합니다.build.gradle:

allprojects { project ->
    project.plugins.withId('java') {
        test {
            maxHeapSize = "1536M"
            // If you don't want to use spring.properties (or add other JVM args)
            jvmArgs "-Dspring.test.context.cache.maxSize=1"
        }
    }
    project.plugins.withId('java-library') {
        test {
            maxHeapSize = "1536M"
            // If you don't want to use spring.properties (or add other JVM args)
            jvmArgs "-Dspring.test.context.cache.maxSize=1"
        }
    }
}

언급URL : https://stackoverflow.com/questions/54117965/spring-integration-test-consumes-a-lot-of-memory-uses-a-high-number-of-duplicat

반응형