tomcat, jboss 등 was 를 운영할 때,보통 다음과 같이 heap size 를 고정으로 설정하여 준다
-Xms2048m -Xmx2048m
그런데, 위와 같이 설정 후 실행을 시키면
OS 에서는 실제 위와 같이 사용을 하지 않는 것을 볼 수 있다.
이는 정상적인 것이며, 가상 메모리에 할당을 하고 실제 물리적 메모리는 예약(?) 만 해놓는다는 것 같다..
[root@abc-ap01 /abc/tomcat-8.5.43/bin]# free -m total used free shared buff/cache available Mem: 3781 228 2933 8 619 3311 Swap: 8190 0 8190 |
다음과 같은 옵션을 주어, 미리 물리메모리에 올릴 수 있으나
-XX:+AlwaysPreTouch
아래 redhat 페이지를 보면, 처음 구동 시에 시간이 많이 소요된다는 것 같다.
테스트 방법으로 아래와 같이 Test.java 를 만들고
Test.java
public class Test { public static void main(String [] args) { System.out.println("Hello World!"); } } |
컴파일을 하고
[root@k8s-master /tmp]# javac Test.java |
실행 시간을 측정해 보면
[root@k8s-master /tmp]# time java -Xmx2G -Xms2G -XX:+AlwaysPreTouch Test; Hello World! real 0m1.110s user 0m0.135s sys 0m0.981s |
차이가 많이 나는 것을 볼 수 있다.
AlwaysPreTouch 옵션에 대한 동작이 단일 스레드로 처리되어 그렇다는데, JDK9 버전부터는 병렬처리가 된다는 것 같다.
[root@k8s-master /tmp]# time java -Xmx2G -Xms2G Test; Hello World! real 0m0.077s user 0m0.061s sys 0m0.023s |
대신에 구동된 뒤에는 액세스 시간이 줄어든다? 는 내용 같다...
참고사이트 :
https://stackoverflow.com/questions/43302720/do-the-xms-and-xmx-flags-reserve-the-machines-resources/43307880#43307880
https://stackoverflow.com/questions/48982636/java-heap-xms-and-linux-free-memory-different
https://access.redhat.com/solutions/2685771