2. 텍스트
기본방향
▸메모리로 인해 일어나는 문제
▸프로세스 비정상 종료: segment fault, 메모리 부족
▸성능저하: GC 자주 발생, 캐시적중률 저하, 자주 메모리 Swap 발생
▸프로세스 메모리 확인 시 중점 체크 항목
▸사용량: 대량 메모리 사용 프로세스, 영역별 메모리 사용 구조
▸메모리 누수 여부: 시간에 따른 지속적인 증가, Full GC 후 힙 메모리
사용 지속적 증가
▸코어덤프 발생 여부: 코어덤프 발생 여부 및 이유
3. 텍스트
프로세스 메모리 구조
▸가상 메모리 체계
▸동일 메모리 주소 범위 사용
▸다른 프로세스 메모리 침범 예방
▸Kernel Spece
▸kernel 기본 기능, 확장기능, device driver memory
▸모든 프로세스가 공유해서 사용
▸User Space
▸사용자 모드의 프로그램이 동작하는 영역
4. 텍스트
프로세스 메모리 영역 분
류
▸ TEXT (R) : 실행코드
▸ DATA (R, R/W): 전역변수, 정적변수
▸ BSS: 초기화되지 않은 전역변수, 정
적변수
▸ HEAP (R/W): 동적 메모리 할당
▸ STACK (R/W): 함수호출 정보
5. 텍스트
프로세스 영역별 메모리 사용량 확인
▸AIX: svmon -p [pid]
▸HP-UX: pmap [pid]
▸Solaris: pmap -x [pid]
▸Linux: cat /proc/[pid]/status
▸Windows: vmmap.exe
6. 텍스트
LINUX PROCESS
MEMORY▸ VmPeak: 할당된 가상 메모리 최대값
▸ VmSize: 할당된 전체 가상 메모리 크기
▸ VmLck: 락된 메모리 크기
▸ VmPIN: 고정 메모리 크기(스왑 불가)
▸ VmHWM: 물리메모리 최대 할당 크기
▸ VmData: 힙 영역 크기
▸ VmRSS: 물리메모리 할당 크기
▸ VmStk: 스택 메모리 크기
▸ VmExe: 전역 변수와 실행코드 메모리 크기
▸ VmLib: 공유 라이브러리 메모리 크기
▸ VmPTE: 페이지 테이블 엔트리 크기
▸ VmSwap: 사용된 페이징 스페이스 크기
7. 텍스트
메모리 누수 조사
▸메모리누수: 프로세스 메모리 사용량이 지속적 증가하는 현상
▸급격한 성능저하 및 다운 원인: 물리 메모리 부족으로 인한 스와핑
▸정기적으로 프로세스를 재기동해 메모리 사용량 초기화
▸원인
▸할당한 힙 메모리 미해제: malloc / new => free / delete
▸내부 캐시영역에 데이터 지속적 증가
▸free시 즉시 메모리 해제하지 않음 => 할당한 메모리 재활용 위함
▸메모리 누수는 지속적으로 증가하는 패턴을 가지고 있는지 확인 필요
8. 텍스트
메모리 누수 조사방법
▸Windows: umdh.exe(User Mode Dump Heap) 활용
▸AIX: 메모리 디버거, probevue(메모리 추적도구) 사용
▸Solaris: 메모리 디버거, dtrace(메모리 추적도구) 사용
▸HP-UX: WDB 도구 이용
▸Linux: valgrid, heap checker 도구 이용
▸정적분석도구를 이용한 소스코드 체크
9. 텍스트
LINUX - VALGRIND
▸에뮬레이션 환경에서 프로세스 수행해서 메모리 누수 체크
▸성능이 현저히 저하됨
▸체크방법
▸valgrind 환경에서 체크대상 프로그램 실행
$ valgrind —leak-check=full —trace-children=yes
—log-file=m%p.log [process cmd]
▸대상 프로그램 종료 => 메모리 누수 요약정보 로그 생성
10. 텍스트
LINUX - TCMALLOC (HEAP CHECKER)
▸malloc/free function을 hooking해서 메모리 누수 모니터링
▸홈페이지: https://github.com/gperftools/gperftools
▸수행 방법
▸라이브러리 설정
1. compile 시 tcmalloc lib.을 linking해서 수행
2. compile안한 binary 실행 시 LD_PRELOAD에서 libtcmalloc.so 지정
▸HEAPPROFILE 환경변수에 로깅할 파일명 지정
▸프로그램 시작/종료
▸결과로그로 메모리 누수 확인