1. 개요
- 성능 및 부하테스트를 진행할 경우 가장 먼저 보는 지표가 메모리의 점유율이다. 즉 컴퓨터가 해당 성능을 수행하기 위해 얼마나 많은 메모리를 사용하고 있는 지를 살펴본다.
- 이 성능/부하 테스트의 요지는 결국 다수의 사용자가 몰릴때 DB 과부하 여지가 존재하는가(쿼리성능), 자바 객체 및 실행 메소드 등이 필요이상의 메모리를 점유하고 있는가(JVM/OS성능)를 파악하고 이에 대한 방안을 제시하고자 진행한다.
2. 생각할 점, JVM/OS 메모리 개념
- 성능 테스트 간 JVM/OS 메모리 점유율은 보통 40%, 60%를 적정치로 설정하고 있다.
- 이때 JVM이 자바 프로그램을 실행하기 위해서는 기본적으로 OS로부터 메모리 할당을 받아야 하며, 스택과 힙 메모리에 클래스 파일을 적재한 후 실행해야 한다. 따라서 성능/부하테스트 진행 시 JVM과 OS메모리의 구조나 상관관계를 알고 있으면 참고가 많이 된다.
- 무작정 메모리 점유율의 숫자를 바라보지 말고, 왜 JVM메모리와 OS메모리가 사용되고 두 개념을 알아야 하는지 먼저 생각하는게 중요하다는 의미이다.
3. 유의사항
- 기본적으로 JVM과 OS는 비슷한 구조(힙메모리, 스택메모리)를 지니고 있는데, 메소드(함수) 및 객체/데이터 할당 등 그 역할도 비슷하다.
- JVM이 실행할 때 OS로부터 메모리를 할당받아 Run time Data Area에 저장하고, 더불어 실행할 메소드 및 객체 데이터들도 각각 내부의 힙메모리와 스택메모리에 저장한다. 이후 컴파일러를 통해 기계어로 변경하여 최종적으로 자바 프로그램을 실행한다.
- OS가 할당된 물리메모리는 구체적으로 Heap에 저장되며, 해당 메모리 중 일부를 객체 주소에 할당한 후 사용이 모두 완료되었다 하더라도 재활용하여 사용하므로 gc를 바로 진행하지 않는다.
- 따라서 gc를 한다 하더라도 메모리 릭을 고려하지 않으면 안되는 이유가 여기 있다.
- 부하테스트 시 JVM메모리는 WAS에서 사용하고, OS메모리는 운영체제에서 사용하며 JVM의 경우 40%, OS의 경우 60%를 넘지않는 것이 좋다.
4. 참고자료
JVM/OS메모리 비교 : https://velog.io/@yoojeongkwon/JAVA-JVM-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0%EC%99%80-OS-%EA%B0%80%EC%83%81-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0-%EB%B9%84%EA%B5%90
JVM/OS메모리 비교(좀 더 쉬운 설명) : https://inpa.tistory.com/entry/JAVA-%E2%98%95-JVM-%EB%82%B4%EB%B6%80-%EA%B5%AC%EC%A1%B0-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%98%81%EC%97%AD-%EC%8B%AC%ED%99%94%ED%8E%B8
gc 후 os에게 바로 메모리 할당을 하지 않는다 : https://woooongs.tistory.com/86