티스토리 뷰

JVM Internal 세미나를 진행하다 보면 자신이 설정한 Heap Size와 OS 프로세스 메모리에 대해 질문은 받는 경우가 많았다. 질문의 내용은 대충 다음과 같다. Heap Size를 -Xms512m, -Xmx1024m로 잡은 경우 Java Process가 실제로 점유한 메모리는 얼마인가? 그리고 Top이나 ps를 통해 모니터링 된 rss, vsz의 크기는 어떤 것을 의미하는가?

이 질문에 답을 하기 위해 32bit의 linux머신에서 수행 중인 WAS Process를 추적해 보기로 하였다.

[jeus5@InterMax2 ~]$ ps -eo pid,cmd | grep 1052

1052 /usr/local/java_1.4/bin/java -server -Xmx512m -Xbootclasspath/p:/home/jeus5/jeus5/lib/system/extension.jar -classpath /home/jeus5/intermax/jspd-2.9.2/lib/aspectjweaver.jar:/home/jeus5/intermax/jspd-2.9.2/lib/ojdbc14.jar:/home/jeus5/jeus5/lib/system/bootstrap.jar -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Djava.library.path=/home/jeus5/jeus5/lib/system -Djava.naming.factory.initial=jeus.jndi.JNSContextFactory -Djava.naming.factory.url.pkgs=jeus.jndi.jns.url -Djava.net.preferIPv4Stack=true -Djava.util.logging.config.file=/home/jeus5/jeus5/bin/logging.properties -Djeus.home=/home/jeus5/jeus5 -Djeus.baseport=9736 -Djeus.jvm.version=hotspot -Djeus.tm.checkReg=true -Djeus.tool.webadmin.locale.language=ko -Djeus.net.reuseAddress=true -Djeus.properties.replicate=jeus,sun.rmi,java.util,java.net jeus.server.JeusBootstrapper -xml

 

현재 WAS 프로세스는 1052라는 PID를 가지고 있고 –Xmx512m로 그리고 –Xms는 설정이 되어 있지 않은 상태이다. 이 프로세스의 메모리 점유를 확인하기 위해 ps명령을 이용하여 다음과 같은 결과를 얻었다.

[jeus5@InterMax2 ~]$ ps -eo euser,pid,vsz,rss,comm | grep 1052
jeus5 1052 828604 115112 java

 

ps의 –o 옵션은 user define column에 따라 출력이 가능하게 해 준다. 메모리를 모니터링 하기 위해 출력한 정보는 euser( OS User의 이름), pid (Process ID), vsz(Virtual Size), rss(resident size), comm.(command명)이다. 여기서 메모리 정보는 vsz와 rss의 두 가지 이다. Vsz는 말 그대로 가상 메모리의 크기를 의미하고 rss는 현재 점유하고 있는 크기를 의미한다.

이 프로세스의 가상 메모리의 크기는 현재 828,604Kbytes, 즉 800메가 정도로 나타나고 있고 현재 점유하고 있는 크기는 115,112Kb 즉 100메가 남짓한 크기로 표현된다. 그러므로 현재 물리적으로 할당 받아 메모리를 점유하고 있는 크기가 100 메가 정도 된다는 의미가 된다.

그렇다면 가상메모리의 800메가는 어떤 의미일까? 이를 알아보기 위해 pmap을 이용해 보기로 하였다.

[jeus5@InterMax2 ~]$ pmap 1052
00000000002a4000 88K r-x-- /lib/ld-2.3.4.so
00000000002ba000 4K r-x-- /lib/ld-2.3.4.so
00000000002bb000 4K rwx-- /lib/ld-2.3.4.so
00000000002be000 1176K r-x-- /lib/tls/libc-2.3.4.so
00000000003e4000 8K r-x-- /lib/tls/libc-2.3.4.so
00000000003e6000 8K rwx-- /lib/tls/libc-2.3.4.so
00000000003e8000 8K rwx-- [ anon ]
00000000003ec000 132K r-x-- /lib/tls/libm-2.3.4.so
000000000040d000 4K r-x-- /lib/tls/libm-2.3.4.so
000000000040e000 4K rwx-- /lib/tls/libm-2.3.4.so
0000000000411000 8K r-x-- /lib/libdl-2.3.4.so
0000000000413000 4K r-x-- /lib/libdl-2.3.4.so
0000000000414000 4K rwx-- /lib/libdl-2.3.4.so
0000000000429000 56K r-x-- /lib/tls/libpthread-2.3.4.so
0000000000437000 4K r-x-- /lib/tls/libpthread-2.3.4.so
0000000000438000 4K rwx-- /lib/tls/libpthread-2.3.4.so
0000000000439000 8K rwx-- [ anon ]
000000000052b000 76K r-x-- /lib/libnsl-2.3.4.so
000000000053e000 4K r-x-- /lib/libnsl-2.3.4.so
000000000053f000 4K rwx-- /lib/libnsl-2.3.4.so
0000000000540000 8K rwx-- [ anon ]
====================================================================================================
 

====================================================================================================
0000000008048000 44K r-x-- /usr/local/j2sdk1.4.2_17/bin/java
0000000008053000 8K rwx-- /usr/local/j2sdk1.4.2_17/bin/java
0000000008055000 14564K rwx-- [ anon ]
====================================================================================================
00000000c63b4000 4K ----- [ anon ]
00000000c63b5000 52K rwx-- [ anon ]
00000000c63c2000 12K ----- [ anon ]
00000000c63c5000 448K rwx-- [ anon ]

00000000c7adc000 4K ----- [ anon ]
00000000c7add000 52K rwx-- [ anon ]
00000000c7aea000 12K ----- [ anon ]
00000000c7aed000 448K rwx-- [ anon ]
00000000c7b5d000 452K r-xs- /jeus5/webhome/admin_home/WEB-INF/lib/javassist.jar
00000000c7bce000 360K r-xs- /jeus5/webhome/admin_home/WEB-INF/lib/log4j-1.2.14.jar
00000000c7c28000 40K r-xs- /jeus5/webhome/admin_home/WEB-INF/lib/hivemind-jmx-1.1.1.jar
00000000c7c32000 68K r-xs- /jeus5/webhome/admin_home/WEB-INF/lib/commons-io-1.2.jar
00000000c7c43000 312K r-xs- /jeus5/webhome/admin_home/WEB-INF/lib/tapestry-contrib-4.0.2.jar
00000000c7c91000 40K r-xs- /jeus5/webhome/admin_home/WEB-INF/lib/tapestry-annotations-4.0.2.jar
00000000c7c9b000 140K r-xs- /jeus5/webhome/admin_home/WEB-INF/lib/jCharts-0.7.5.jar
00000000c7cbe000 76K r-xs- /jeus5/webhome/admin_home/WEB-INF/lib/hivemind-lib-1.1.1.jar
00000000c7cd1000 1064K r-xs- /jeus5/webhome/admin_home/WEB-INF/lib/tapestry-4.0.2.jar
00000000c7ddb000 32K r-xs- /jeus5/webhome/admin_home/WEB-INF/lib/commons-fileupload-1.1.1.jar
00000000c7de3000 52K r-xs- /jeus5/webhome/admin_home/WEB-INF/lib/commons-logging-1.1.jar
00000000c7df0000 48K r-xs- /jeus5/webhome/admin_home/WEB-INF/lib/commons-codec-1.3.jar
00000000c7dfc000 380K r-xs- /jeus5/webhome/admin_home/WEB-INF/lib/hivemind-1.1.1.jar
00000000c7e5b000 168K r-xs- /jeus5/webhome/admin_home/WEB-INF/lib/ognl-2.6.9.jar
00000000c7e85000 240K r-xs- /jeus5/webhome/admin_home/WEB-INF/lib/commons-lang-2.2.jar
00000000c7ec1000 64K r-xs- /jeus5/webhome/admin_home/WEB-INF/lib/jakarta-oro-2.0.8.jar
00000000c7ed1000 188K r-xs- /jeus5/webhome/admin_home/WEB-INF/lib/commons-beanutils.jar
00000000c7f00000 236K rwx-- [ anon ]
00000000c7f3b000 788K ----- [ anon ]
00000000c8013000 4K r-x-- /jeus5/lib/system/libCUtility.so
00000000c8014000 4K rwx-- /jeus5/lib/system/libCUtility.so
00000000c807d000 4K ----- [ anon ]
00000000c807e000 52K rwx-- [ anon ]
00000000c808b000 12K ----- [ anon ]
00000000c808e000 448K rwx-- [ anon ]

00000000c8e22000 52K rwx-- [ anon ]
00000000c8e2f000 12K ----- [ anon ]
00000000c8e32000 448K rwx-- [ anon ]
00000000c8ea2000 3440K r-xs- /home/jeus5/jeus5/lib/datasource/ojdbc14.jar
00000000c91fe000 756K r-xs- /home/jeus5/jeus5/lib/datasource/hsqldb.jar
00000000c92bb000 124K r-xs- /home/jeus5/jeus5/lib/system/omgapi.jar
00000000c92da000 1480K r-xs- /home/jeus5/jeus5/lib/system/jms.jar
00000000c947d000 4K ----- [ anon ]
00000000c947e000 52K rwx-- [ anon ]
00000000c948b000 12K ----- [ anon ]
00000000c948e000 448K rwx-- [ anon ]
00000000c94fe000 4K ----- [ anon ]

00000000c9b8d000 12K ----- [ anon ]
00000000c9b90000 1432K rwx-- [ anon ]
00000000c9cf6000 40K ----- [ anon ]
00000000c9d2c000 20K r-x-- /usr/local/j2sdk1.4.2_17/jre/lib/i386/libnio.so
00000000c9d31000 4K rwx-- /usr/local/j2sdk1.4.2_17/jre/lib/i386/libnio.so
00000000c9d32000 24K r-x-- /home/jeus5/jeus5/lib/system/libJeusNet.so
00000000c9d38000 4K rwx-- /home/jeus5/jeus5/lib/system/libJeusNet.so
00000000c9d39000 4K ----- [ anon ]
00000000c9d3a000 52K rwx-- [ anon ]
00000000c9d47000 12K ----- [ anon ]
00000000c9d4a000 448K rwx-- [ anon ]
00000000c9dba000 16K r-x-- /home/jeus5/jeus5/lib/system/libRunner.so
00000000c9dbe000 4K rwx-- /home/jeus5/jeus5/lib/system/libRunner.so
00000000c9dbf000 56K r-x-- /usr/local/j2sdk1.4.2_17/jre/lib/i386/libnet.so
00000000c9dcd000 4K rwx-- /usr/local/j2sdk1.4.2_17/jre/lib/i386/libnet.so
00000000c9dce000 88K r-xs- /home/jeus5/jeus5/lib/system/jaxb-api.jar
00000000c9de4000 1964K r-xs- /home/jeus5/jeus5/lib/system/jxerces.jar
00000000c9fcf000 40K r-xs- /home/jeus5/jeus5/lib/system/jconsole.jar
00000000c9fd9000 288K r-xs- /home/jeus5/jeus5/lib/system/xmlsec.jar
00000000ca021000 156K r-xs- /home/jeus5/jeus5/lib/system/extensionReflection.jar
00000000ca088000 80K r-xs- /home/jeus5/jeus5/lib/system/jsap.jar
00000000ca09c000 48K r-xs- /home/jeus5/jeus5/lib/system/activation.jar
00000000ca0a8000 76K r-xs- /home/jeus5/jeus5/lib/system/j2com.jar
00000000ca0bb000 400K r-xs- /home/jeus5/jeus5/lib/system/orblib.jar
00000000ca11f000 1928K r-xs- /home/jeus5/jeus5/lib/system/toolresource.jar
00000000ca301000 52K r-xs- /home/jeus5/jeus5/lib/system/jtmax.jar
00000000ca30e000 36K r-xs- /home/jeus5/jeus5/lib/system/ejbinteropFor5.jar
00000000ca317000 1068K r-xs- /home/jeus5/jeus5/lib/system/jeusutil.jar
00000000ca422000 888K r-xs- /home/jeus5/jeus5/lib/system/optorbcomp.jar
00000000ca500000 1012K rwx-- [ anon ]
00000000ca5fd000 12K ----- [ anon ]
00000000ca618000 68K r-xs- /home/jeus5/jeus5/lib/system/howl.jar
00000000ca629000 2204K r-xs- /home/jeus5/jeus5/lib/system/derby.jar
00000000ca850000 1344K r-xs- /home/jeus5/jeus5/lib/system/jsse14_repack.jar
00000000ca9a0000 272K r-xs- /home/jeus5/jeus5/lib/system/ldap.jar
00000000ca9e4000 12K r-xs- /home/jeus5/jeus5/lib/system/sasl.jar
00000000ca9e7000 1764K r-xs- /home/jeus5/jeus5/lib/system/jaxb-libs.jar
00000000caba0000 72K r-xs- /home/jeus5/jeus5/lib/system/xml_resource.jar
00000000cabb2000 264K r-xs- /home/jeus5/jeus5/lib/system/snmp_agent.jar
00000000cabf4000 5288K r-xs- /home/jeus5/jeus5/lib/system/jxalan.jar
00000000cb11e000 468K r-xs- /home/jeus5/jeus5/lib/system/xsdlib.jar
00000000cb193000 280K r-xs- /home/jeus5/jeus5/lib/system/jaxb-impl.jar
00000000cb1d9000 1540K r-xs- /home/jeus5/jeus5/lib/system/peorb.jar
00000000cb35a000 8K r-xs- /home/jeus5/jeus5/lib/system/namespace.jar
00000000cb35c000 1012K r-xs- /home/jeus5/jeus5/lib/system/tmaxjce_jdk14x.jar
00000000cb459000 100K r-xs- /home/jeus5/jeus5/lib/system/jmxtools.jar
00000000cb472000 32K r-xs- /home/jeus5/jeus5/lib/system/ejbinterop.jar
00000000cb47a000 348K r-xs- /home/jeus5/jeus5/lib/system/jmxri.jar
00000000cb4d1000 4448K r-xs- /home/jeus5/jeus5/lib/system/jxml-impl.jar
00000000cb929000 32K r-xs- /home/jeus5/jeus5/lib/system/relaxngDatatype.jar
00000000cb931000 344K r-xs- /home/jeus5/jeus5/lib/system/webt50.jar
00000000cb987000 372K r-xs- /home/jeus5/jeus5/lib/system/jmxremote.jar
00000000cb9e4000 348K r-xs- /home/jeus5/jeus5/lib/system/mail.jar
00000000cba3b000 136K r-xs- /home/jeus5/jeus5/lib/system/wsm.jar
00000000cba5d000 7144K r-xs- /home/jeus5/jeus5/lib/system/jeusjaxb.jar
00000000cc157000 4976K r-xs- /usr/local/j2sdk1.4.2_17/lib/tools.jar
00000000cc633000 240K rwx-- [ anon ]
00000000cc66f000 12840K r-xs- /home/jeus5/jeus5/lib/system/jeus.jar
00000000cd2f9000 16K r-xs- /home/jeus5/jeus5/lib/system/bootstrap.jar
00000000cd2fd000 3440K r-xs- /home/jeus5/intermax/jspd-2.9.2/lib/ojdbc14.jar
00000000cd659000 1844K r-xs- /home/jeus5/intermax/jspd-2.9.2/lib/aspectjweaver.jar
00000000cd826000 112K r-xs- /usr/local/j2sdk1.4.2_17/jre/lib/ext/sunjce_provider.jar
00000000cd842000 760K r-xs- /usr/local/j2sdk1.4.2_17/jre/lib/ext/localedata.jar
00000000cd900000 52K r-xs- /usr/local/j2sdk1.4.2_17/jre/lib/ext/ldapsec.jar
00000000cd90d000 12K r-xs- /usr/local/j2sdk1.4.2_17/jre/lib/ext/dnsns.jar
00000000cd910000 4K ----- [ anon ]
00000000cd911000 512K rwx-- [ anon ]

00000000ce015000 4K ----- [ anon ]
00000000ce016000 512K rwx-- [ anon ]
00000000ce096000 1028K r-x-- /usr/lib/locale/locale-archive
00000000ce197000 2048K r-x-- /usr/lib/locale/locale-archive
00000000ce397000 4K ----- [ anon ]
00000000ce398000 52K rwx-- [ anon ]

00000000ce71f000 48K rwx-- [ anon ]
00000000ce72b000 80K rwx-- [ anon ]

00000000ce73f000 5252K rwx-- [ anon ]
00000000cec60000 52992K rwx-- [ anon ]
00000000d2020000 41500K rwx-- [ anon ]
00000000d48a7000 424548K rwx-- [ anon ]

00000000ee740000 23040K rwx-- [ anon ]
00000000efdc0000 42496K rwx-- [ anon ]
----------------------------------------------------------------------------------------------------
00000000f274c000 216K rwx-- [ anon ]
00000000f2782000 712K rwx-- [ anon ]
00000000f2834000 3584K rwx-- [ anon ]
00000000f2bb4000 45568K rwx-- [ anon ]
00000000f5834000 5972K r-xs- /usr/local/j2sdk1.4.2_17/jre/lib/charsets.jar
00000000f5e09000 72K r-xs- /usr/local/j2sdk1.4.2_17/jre/lib/jce.jar
00000000f5e1b000 884K r-xs- /usr/local/j2sdk1.4.2_17/jre/lib/jsse.jar
00000000f5ef8000 88K r-xs- /usr/local/j2sdk1.4.2_17/jre/lib/sunrsasign.jar
00000000f5f0e000 296K rwx-- [ anon ]
00000000f5f58000 26364K r-xs- /usr/local/j2sdk1.4.2_17/jre/lib/rt.jar
00000000f7917000 56K r-xs- /home/jeus5/jeus5/lib/system/extension.jar
00000000f7925000 56K r-x-- /usr/local/j2sdk1.4.2_17/jre/lib/i386/libzip.so
00000000f7933000 8K rwx-- /usr/local/j2sdk1.4.2_17/jre/lib/i386/libzip.so
00000000f7935000 112K r-x-- /usr/local/j2sdk1.4.2_17/jre/lib/i386/libjava.so
00000000f7951000 8K rwx-- /usr/local/j2sdk1.4.2_17/jre/lib/i386/libjava.so
00000000f7953000 36K r-x-- /lib/libnss_files-2.3.4.so
00000000f795c000 4K r-x-- /lib/libnss_files-2.3.4.so
00000000f795d000 4K rwx-- /lib/libnss_files-2.3.4.so
00000000f7973000 52K r-x-- /usr/local/j2sdk1.4.2_17/jre/lib/i386/libverify.so
00000000f7980000 8K rwx-- /usr/local/j2sdk1.4.2_17/jre/lib/i386/libverify.so
00000000f7982000 16K rwxs- /tmp/hsperfdata_jeus5/1052
00000000f7986000 24K r-x-- /usr/local/j2sdk1.4.2_17/jre/lib/i386/native_threads/libhpi.so
00000000f798c000 8K rwx-- /usr/local/j2sdk1.4.2_17/jre/lib/i386/native_threads/libhpi.so
00000000f798e000 5976K r-x-- /usr/local/j2sdk1.4.2_17/jre/lib/i386/server/libjvm.so
00000000f7f64000 360K rwx-- /usr/local/j2sdk1.4.2_17/jre/lib/i386/server/libjvm.so
00000000f7fbe000 96K rwx-- [ anon ]
00000000ffe01000 40K rwx-- [ anon ]
00000000ffe0b000 12K ----- [ anon ]
00000000ffff0000 56K rwx-- [ stack ]
00000000ffffe000 4K r-x-- [ anon ]
total 828604K

 

Pmap은 프로세스의 메모리 할당 현황을 보여주는 툴로 현재 1052 프로세스의 메모리가 어떻게 할당되어 있는지를 알려준다. Java 프로세스 하나에 엄청나게 많은 메모리 번지가 있고 각각 어지럽게 파일 또는 anonymous memory 로 할당이 되어 있음을 알 수 있다. (여기서 anon은 OS상의 특정 vnode, file, directory 들과 매칭이 되지 않아 명칭이 표현되지는 않았지만 할당이 되어 있는 메모리를 의미한다.)

이 pmap 결과의 가장 하단을 보면 할당된 전체 메모리의 합이 828,604Kb로 나타난 것을 알 수 있다. 이 값은 PS의 vsz의 값과 동일함을 알 수 있다. 그렇다면 vsz는 실제로 프로세스에 할당된 메모리의 번지수의 합과 같다고도 할 수 있다.

그런데 OS는 왜 메모리의 크기를 이렇게 두 가지로 표현을 하는 것인지 의문을 가지지 않을 수 없다. 그 이유는 OS가 한정된 메모리로 많은 일을 처리하기 위한 가상메모리 기술을 사용하고 있기 때문이다. 가상 메모리가 무엇인지는 아래의 정의를 보고 이해하도록 하자.

가상 메모리는 메모리를 관리하는 방법의 하나로, 프로그램에 실제 메모리 주소가 아닌 가상의 메모리 주소를 주는 방식을 말한다.

이러한 방식은 멀티태스킹 운영체제에서 흔히 사용되며, 실제 주기억장치보다 메모리 영역을 제공하는 방법으로도 사용된다.

가상적으로 주어진 주소를 가상 주소(virtual address) 또는 논리 주소(logical address) 라고 하며, 실제 메모리 상에서 유효한 주소를 물리 주소(physical address) 또는 실주소(real address)라고 한다. 가상 주소의 범위를 가상 주소 공간, 물리 주소의 범위를 물리 주소 공간이라고 한다.

  가상 주소 공간은 메모리 관리 장치(MMU) 의해서 물리 주소로 변환된다. 덕분에 프로그래머는 가상 주소 공간상에서 프로그램을 짜게 되어 프로그램이나 데이터가 주메모리상에 어떻게 존재하는지를 의식할 필요가 없어진다. 대부분의 현대적 아키텍처와 운영체제는 가상 메모리 기능을 제공하며, 각각의 응용프로그램에 적합한 메모리 관리를 위해 어도비 포토샵과 같은 일부 응용 프로그램은 스스로 가상 메모리를 관리하기도 한다.

 

(출처 : 위키피디아 http://ko.wikipedia.org/wiki/%EA%B0%80%EC%83%81_%EB%A9%94%EB%AA%A8%EB%A6%AC )

 

위의 정의에서 보면 우리가 프로그램을 수행할 때는 가상 주소와 물리 주소가 필요하며 프로그램 실행 시에는 가상 주소가 물리 주소로 매핑되어 사용한다고 생각할 수 있다. 더 확장해 보면 프로세스는 물리 주소를 항상 할당 받은 상태가 아닐 수도 있다는 것도 알 수 있다.

기본적으로 OS는 프로세스마다 가상의 주소 공간(Virtual Address Space, VAS)라는 것을 제공한다. 우리가 흔히 32bit머신이 4GB의 제약이 있다고 하는데 그것이 바로 VAS가 32bit일 경우 4GB까지 밖에 주소를 할당 받지 못하기 때문이다.

더 자세히 말하자면 32bit라고 하는 것은 메모리의 주소를 표현하는 방법이 이진수를 32개 늘어놓은 것과 같다는 의미를 가진다. 그러므로 이 주소를 수식으로 바꾸면 2^32이고 이 값은 4,294,967,296 bytes이다. 이 값이 4GB이기 때문에 32bit에서는 4GB이상 사용할 수 없다는 의미가 되는 것이다.

그러므로 현재 Java 프로세스에서 할당 받은 800MB가량의 메모리는 VAS에 할당된 메모리 주소의 합으로 볼 수 있다. 그리고 현재 사용하고 있는 100mb가량의 메모리는 부여 받은 물리 주소의 총 합이라고 생각할 수 있다.

만약 메모리의 양을 물리적인 메모리로만 생각하고 있다면 현재 이 프로세스가 사용하는 메모리의 양은 약 100M가 되는 것이고 가상 메모리까지 감안해서 생각한다면 이 프로세스는 800M의 메모리를 할당 받았다고 얘기할 수 있는 것이다.

댓글
댓글쓰기 폼