WHEREIS

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

이 글을 공유합시다

facebook twitter kakaoTalk kakaostory naver band
loading