[CS]stack overflow, out of memory

얼마전에 동료 앱 개발자 분께서 stack overflowout of memory 의 차이를 물어봤다.

내가 현재 Golang 서버개발자로 근무하고 있지만 이전 직장에서 C++ 펌웨어 개발자로 근무 했기에 물어본다고 했다.

펌웨어 개발자로 근무할 때 겪은적 있는 문제들이어서 기억나는대로 답변을 해줬는데 완벽하지 못한듯 해서 다시 찾아보기로 했다.


메모리구조

| code | 낮은 메모리 주소
| data |
| heap |
| empty space |
| stack | 높은 메모리 주소

heap은 낮은 메모리 주소에서 높은 메모리 주소로,
stack은 높은 메모리 주소에서 낮은 메모리 주소로

메모리를 사용한다.

1. Stack overflow

call stack pointer가 stack bound를 초과하면 발생한다. 즉, 프로그램이 가능한 call stack 보다 더 많은 공간을 사용하려고 하면 발생한다.
무한한 재귀호출을 하면 확인할 수 있다.

int test() {
	return test();
}

혹은 함수 안에서 큰 스택 변수를 사용하면 발생할 수 있다.

int test() {
	double value[1234567890];
} 

2. out of memory

더이상 사용할 수 있는 충분한 공간이 없을 때 발생한다. 메모리에 할당하기만 하고 free 시켜주지 않은 상태가 지속적으로 발생하면 일어날 수 있다. 혹은 너무 큰 데이터를 로딩하거나 하면 발생할 수 있다.

stack overflow는 stack 메모리와 연관이 있고,
out of memory는 heap 메모리와 연관이 있다.


java, python, c#, javascript 와 같은 Managed Language를 사용하다 보면 메모리 관리를 언어상에서 알아서 해주기에 메모리에 대한 생각은 하지않고 코드를 작성할 수 있다.

하지만 C, C++, 어셈블리와 같은 Unmanaged Language를 사용하면 메모리 누수가 없게 신경을 써줘야 한다. 하드웨어에 더 가까운 언어이기 때문에 성능면에서 더 좋다는 장점이 있다.

펌웨어 개발자로 근무하던 시절에 stack overflow도 out of memory 도 겪었다.

stack overflow는 OTA 기능을 만들 때 발생했었다. 항상 발생하는것은 아니고 간헐적으로 발생했고, 해당 문제를 해결하기 위해 며칠을 고생했는데 결국 stack의 크기가 작아서 발생한다는 결론을 내리고 stack size를 더 할당해 주면서 해결할 수 있었다.

out of memory는 iot단말기가 동작 중에 메모리가 줄어들지 않고 계속 증가해서 발생했었다. 해당 문제는 결국 네트워크 통신 관련 라이브러리에서 memory leak이 발생하는 것을 발견하고 해당 라이브러리를 커스텀해서 사용하면서 해결했다.

현재 주력으로 사용하는 Golang에서도 흔히 겪는 메모리 관련 문제가 있는데, Api 통신 후 바디를 닫아주지 않으면 memory leak이 발생한다. 그래서 항상 defer body.close() 를 잊지 않고 사용해 주자..!


마침

메모리 관리에 신경쓸 필요 없는 Managed Language 가 분명 개발할 때 편하다. 하지만 그 언어의 내부에는 누군가가 작성한 메모리를 관리해주는 코드가 있다. 편하다고 생각없이 사용하다보면 어느순간 정체되어있는 자신을 발견한다. 나에게 질문해준 동료 개발자에게 고맙다!


Reference

좋은 웹페이지 즐겨찾기