티스토리 뷰
이번에는 자바를 컨테이너 환경에서 사용할 때 필요한 XX:+UseContainerSupport 옵션에 대해 알아보도록 하겠습니다.
1. 자바의 컨테이너 환경을 위한 XX:+UseContainerSupport 옵션
[ 자바를 컨테이너 환경에서 구동하는 경우의 문제점 ]
자바는 기본적으로 JVM이라는 가상 머신 위에서 동작을 하게 된다. 그렇기 때문에 자바 애플리케이션을 컨테이너 환경에서 구성한다고 하면, 호스트 OS 위에 컨테이너 위에 JVM이 올라가게 된다.
이러한 구조 때문에 자바는 기본적으로 컨테이너 환경을 제대로 이해하지 못한다. 자바는 기본적으로 GC 쓰레드 수 및 기본 메모리 제한과 같은 런타임 기본값을 설정하기 위해 운영 체제를 쿼리(cgroup)한다. 하지만 문제는 결과가 호스트 머신에 대한 정보를 제공하며 컨테이너 구성 및 제한은 포함되지 않는다는 것이다. 이를 고치려는 시도도 있었지만, 제대로 적용되지 않았다.
[ XX:+UseContainerSupport 옵션의 등장 ]
따라서 자바가 컨테이너 환경을 제대로 이해하도록 XX:+UseContainerSupport 옵션이 추가되었다.
설정(Setting) | 영향(Effect) |
-XX:-UseContainerSupport | 사용하지 않음 |
-XX:+UseContainerSupport | 사용함(Default) |
이를 통해 자바에서 컨테이너에 적합한 최적화가 가능해졌다. 해당 옵션이 활성화되어 있으면 JVM은 컨테이너 환경 내에서 실행 중인지를 감지하고, 그에 따라 기본 설정을 조정하여 성능과 리소스 사용을 최적화한다.
- 메모리 제한: JVM은 컨테이너의 메모리 제한에 따라 기본값을 조정하여 제한된 환경 보다 효율적으로 메모리를 할당할 수 있음
- CPU 감지: JVM은 컨테이너 내에서 사용 가능한 CPU를 감지하고, 내부 쓰레드 풀의 크기를 조정하여 CPU 사용률을 최적화함
- 쓰레드 스택 크기: 컨테이너 내의 메모리를 절약하기 위해 기본 쓰레드 스택 크기를 더 작은 값으로 저장할 수 있음
- 기타 등등
컨테이너에서 실행되는 자바 애플리케이션은 보통 자체적으로 실행되므로 메모리를 두고 경쟁할 필요가 없다. 따라서 해당 옵션을 통해 자바 힙에 더 많은 메모리를 할당할 수 있다. 그 경우 메모리는 아래와 같이 설정된다.
Container memory limit <size> | Maximum Java heap size |
Less than 1 GB | 50% <size> |
1 GB - 2 GB | <size> - 512 MB |
Greater than 2 GB | 75% <size> |
만약 추가적인 메모리 제한을 필요로 한다면 XX:MaxRAMPercentage 옵션을 사용할 수 있다. 해당 값을 75% 정도가 적당한데, 이 정도면 다른 프로세스를 위한 RAM을 남길 수 있을 뿐더러 낭비는 줄어드는 수치라고 한다. 하지만 이는 환경에 맞게 조정이 필요할 수도 있다.
참고로 해당 기능은 자바 10에 도입되어 자바 8u191부터 자바8에 백포트되었으며(자바10에 등장했지만, 자바 8에도 탑재됨), 이를 통해 컨테이너 환경에서 JVM이 메모리를 올바르게 구성할 수 있게 되었다.
참고로 최신 자바를 사용 중이라면 해당 기능이 기본적으로 활성화되어 있을 테인데, 환경에 맞게 찾아보고 사용하도록 하자.
참고 자료
- https://www.ibm.com/docs/en/sdk-java-technology/8?topic=options-xx-usecontainersupport
- https://www.atamanroman.dev/development/2019/09/11/usecontainersupport-to-the-rescue.html
- https://stackoverflow.com/questions/54516988/what-does-usecontainersupport-vm-parameter-do
- https://github.com/eclipse-openj9/openj9/issues/2263
- https://bugs.openjdk.org/browse/JDK-8146115
- https://hyperconnect.github.io/2022/07/19/suspicious-jvm-memory-in-container.html
'Java & Kotlin' 카테고리의 다른 글
[Java] GraalVM이 제공하는 네이티브 이미지(Native Image) (4) | 2023.07.18 |
---|---|
[Java] Hotspot VM의 한계(JIT, Just-In-Time 컴파일러)와 이를 극복하기 위한 GraalVM의 등장 (3) | 2023.07.11 |
[Java] JUnit의 진화 과정과 public 접근 제어자 (2) | 2023.03.07 |
[Java] Integer.valueOf(127) == Integer.valueOf(127)가 True인 이유, Integer 캐시 (6) | 2022.11.08 |
[Java] CompletableFuture에 대한 이해 및 사용법 (8) | 2022.08.16 |