메모리 누수에 관하여
1. 메모리 누수란
요즘들어 단순한 소스코드를 작성하는것뿐아닌 메모리에 대한 공부를 해보려한다 . 조금 부끄러운 이야기지만 맨 처음 코딩을 할때는 운영체제..? 메모리 누수? 이런게 왜 필요 하지 라는 생각을 많이 했던것같다. 점점 실력이 쌓이고 복잡한 프로그램등을 기획하고 개발하는 과정에서 프로그램에 메모리가 정말 중요하다는 생각이 들었다. 그래서 오늘은 메모리 누수를 일단 어떻게 확인을 해야하고 그것들을 어떻게 해결해 나가야하는지를 공부해보려고 한다.
2.메모리 누수 확인하는방법
나는 개발툴중 Xcode 를 사용한다. iOS 개발자가 목표이기 때문이다. 확인 해보는 과정은 생각보다 쉬웠다. 시작해보겠다.
일단
Xcode의 상단에 이부분에 스킴을 선택하면 이런 팝업이 보일것이다.
여기에서 Malloc Scribble 와 Malloc Stack Logging 를 체크표시한다,
그래서 이게 뭔데? 먼저 알아보겠다.
Malloc Scribble : 동적 메모리 할당시에 메모리를 더미값으로 초기화를 해주고 해제되기전까지 어떤 작업이 일어나는지 여부를 감지하는 기능입니다. 이 기능의 목적은 미리 선언하지않은 포인터나 배열 범위를 벗어나는 등의 메모리 오버라이드를 찾아내어 디버깅을 보다 쉽게 할 수 있습니다.
Malloc Stack Logging :동적 메모리 할당 및 해제 작업에 대한 스택 추적 정보를 수집해주는 기능입니다. 여기에서 메모리 할당 및 해제 작업이 어디에서 발생하는지 파악하는 역할을 해줍니다.
앱을 실행한후에 이버튼을 선택해서 현재에의 그래프를 알려주는 버튼을 눌러주면 ,,
이런 모습이 보인다.
여기에서 얕은 화살표와 진한 화살표가 보이는데 이는 각 객체들이 가리키는 참조방향과 함께 객체들이 나타나고 왼쪽에는 현재 생성된 객체들일 나타난다. 여기서 연한 화살표는 약한 참조를 나태내고 , 진한 화살표는 강한 참조를 나타냅니다.
강한 참조들을 따라가면서 누수를 찾아내는것입니다. 왼쪽 네비게이터에는 느낌표도 나온다고 하니 참고를 하면 좋을것같다.
또한 객체의 사용이 종료되면 메모리가 사라져야한다라는 기본개념을 가지고있다면 기능이 끝났는데 사라지지않고 계속 증가한다면 어디선가 계속 순환참조가 일어나고 있다고 생각하면 된다.
4. 느낀점
코드 품질의 중요성: 메모리 누수는 종종 코드의 세심하지 못한 부분에서 발생합니다. 이는 개발자로 하여금 코드 작성 시 더욱 주의 깊고 세심해야 한다는 중요한 교훈을 줍니다. 코드를 깔끔하게 유지하고, 잠재적인 메모리 문제를 예방하기 위한 좋은 코딩 습관을 갖는 것이 중요합니다.
지속적인 모니터링과 테스트의 중요성: 메모리 누수는 단시간 내에 발견하기 어렵기 때문에, 지속적인 모니터링과 테스트가 필수적입니다. 이는 개발 과정에서 정기적인 테스트와 코드 리뷰의 중요성을 강조합니다. 프로파일링 도구나 메모리 분석 도구를 사용하여 메모리 누수를 조기에 발견하고 해결하는 것이 중요합니다.
자원 관리의 중요성: 메모리 누수는 자원 관리의 실패로 볼 수 있습니다. 이는 개발자에게 메모리와 기타 시스템 자원을 효과적으로 관리하는 방법에 대해 배울 필요가 있음을 일깨웁니다. 예를 들어, 자동 메모리 관리가 있는 언어를 사용하거나, 메모리 할당 및 해제를 적절히 관리하는 것이 중요합니다.
장기적인 유지보수의 중요성: 메모리 누수는 종종 시간이 지남에 따라 누적되며, 이로 인해 소프트웨어의 유지보수가 어려워질 수 있습니다. 이는 코드를 장기적으로 유지보수 가능하게 유지하는 것의 중요성을 강조합니다. 깨끗하고, 잘 문서화된, 유지보수가 쉬운 코드를 작성하는 것이 중요합니다.
팀워크와 커뮤니케이션의 중요성: 메모리 누수 문제를 해결하는 데는 종종 팀 내 다양한 개발자의 지식과 경험이 필요합니다. 이는 팀 내에서 활발한 커뮤니케이션과 협력이 중요하다는 것을 보여줍니다. 문제 해결을 위해 팀원들과 지식을 공유하고 협력하는 것이 중요합니다.
결론적으로, 메모리 누수는 단순히 기술적인 문제를 넘어서, 코드의 품질, 지속적인 모니터링과 테스트, 효율적인 자원 관리, 성능과 안정성, 유지보수성, 그리고 팀워크와 커뮤니케이션의 중요성을 깨닫게 하는 중요한 교훈을 제공합니다. 이러한 측면들은 소프트웨어 개발의 광범위한 영역에 걸쳐 중요하며, 개발자가 고품질의 소프트웨어를 만드는 데 필수적입니다.
이런 내용들을 느끼며 오늘도 하루를 보냅니다.