일하다가 알게된 상식정리

OOM(Out Of Memory) 관련

Winter_Snow 2023. 8. 1. 22:22

초보 개발자(본인)가 입사 후 첫번째 프로젝트가 끝나고, 다른 프로젝트를 하러 갔다. 
어느날, 이전 프로젝트의 사람을 만나서 이야기를 하는데 이전의 코딩방식의 문제점을 듣고 꼭 고쳐야겠다는 생각과 함께 이 글을 작성하게 되었다. 


메모리 : 컴퓨터가 연산을 위해 참조하는 공간이다. 

메모리 공간

그림 참조 : https://jinshine.github.io/2018/05/17/%EC%BB%B4%ED%93%A8%ED%84%B0%20%EA%B8%B0%EC%B4%88/%EB%A9%94%EB%AA%A8%EB%A6%AC%EA%B5%AC%EC%A1%B0/

프로그램을 실행하게 되면, OS는 메모리에 실행할 프로그램의 소스코드를 올린다. 
이를 코드 영역이라고 한다. 

프로그램이 사용하는 전역변수, 정적변수는 데이터 영역 

사용자의 동적 할당은 힙 영역

지역변수와 매개변수는 스택 영역에 쌓인다. 

Java 기준으로, 
스택 영역은 지역변수, 매개변수의 {}블락 단위를 넘어서면 자동으로 회수된다.
힙 영역은 JVM이 GC(Gabage Collector)를 이용하여 사용하지 않는 변수 Clear한다.
나머지 static, static final 로 선언한 전역변수, 정적변수와 프로그램의 소스코드는 프로그램이 종료되기까지 데이터가 삭제되지 않는다.

필자는 {}의 단위를 벗어난 곳에 필요하여 static 변수를 선언하였는데, 이것이 쌓이고 쌓여 어느 순간에 OOM을 발생하여 주기적으로 운영환경의 프로그램을 재기동시켜야 했다고 한다.. 
원인도 모르는 사이에 끊임없이 늘어나는 Memory 때문에 어지간히 고생하셨다고.. 


나와 같은 초보 개발자들을 위해서 남겨놓는다. 
1. 변수는 사용하는 곳의 의미에 맞게 타입을 설정한다(적으면 int, 크면 long)
2. 배열의 크기를 매우 크게 잡는 방식의 프로그램을 짜지 않을 것. 
3. static 변수는 한번만 선언되게 하며, 동적으로 늘어나는 경우에는 사용 후 자원을 초기화하는 작업을 진행한다. 
4. connection 객체와 같은 Resource 객체는 try ~ catch ~ finally(resources) 구문을 통해 꼭 close한다. 

더 있을 수도 있지만, 결국 핵심은 안일한 변수 사용으로 현업에서 운영의 서버, 프로그램을 재기동 해야할 일이 생긴다면, 아찔한 대가를 치를 수도 있다. 
안 겪어보면 모르겠지만, 겪어보니 기초가 중요하더라.

'일하다가 알게된 상식정리' 카테고리의 다른 글

GC(Garbage Collector) 관련  (0) 2023.08.01