본문 바로가기

카테고리 없음

메모리 누수 (Memory leak) 현상과 사례

반응형

메모리 누수 (Memory leak)

 메모리 릭 현상은 컴퓨터 프로그램이 필요하지 않은 메모리를 계속 점유하고 있는 현상으로, 불필요한 메모리가 해제되지 않으면서 메모리 할당을 잘못하는 경우 발생합니다. 이러한 현상이 발생하는 여러 가지 이유가 있지만, 그중 여섯 가지에 대해 알아보겠습니다.

 

메모리 누수 사례

 첫번째로 잘못된 이벤트 핸들러 관리 시 발생하는 경우입니다. 하단의 예시 코드를 실행하면 C#에서의 delegate/event 추상화로 인한 메모리 누수가 발생하는 현상을 확인할 수 있습니다.

using System;

class Program
{
    static void Main(string[] args)
    {
        UILayout layout = new UILayout();

        while (true)
        {
            for (int i = 0; i < 1000; i++)
            {
                UIElement uiElem = new UIElement();
                layout.LayoutChanged += UIElement.s_Layout_LayoutChanged;
            }
        }
    }
}

public class UILayout
{
    public event EventHandler LayoutChanged;
}

public class UIElement
{
    public static void s_Layout_LayoutChanged(object sender, EventArgs e)
    {
    }
}

 두 번째 사례로는 정적 변수의 사용에 관련된 예시를 들어보도록 하겠습니다. 하단의 코드에서는 Static 변수에 보관된 _cmds의 인스턴스들을 GC(Garbage Collection)가 회수하지 못하므로 발생하게 되는 메모리 누수 현상입니다.

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        while (true)
        {
            for (int i = 0; i < 100; i++)
            {
                ConsoleHelper ch = new ConsoleHelper();
            }
        }
    }
}

public class ConsoleHelper
{
    static List<ConsoleCommand> _cmds = new List<ConsoleCommand>();

    public ConsoleHelper()
    {
        _cmds.Add(new ConsoleCommand());
    }
}

public class ConsoleCommand
{
}

 세번째로는 잘못된 Cache를 사용하였을 때, 해당 현상이 발생하고, Cache 용도로 무언가를 보관할 때, '일정 시간 동안 사용하지 않으면 제거', ' 캐시의 최대 용량 설정', 'WeakReference를 사용해서 GC(Garbage Collection)가 임의로 해제' 할 수 있게 하면 해당 문제를 해결할 수 있습니다.

 네번째로는 잘못된 WPF(Windows Presentation Foundation) 바인딩 사용입니다. 이때는 바인딩 모드가 OneWay이거나 TwoWay일 때 메모리 누수 현상이 발생합니다. 여기서 바인딩이 OneTime 또는  OneWqyToSource이면 메모리 누수가 발생하지 않습니다.

 다섯번째는 종료되지 않은 Thread를 사용할 때입니다. Thread가 종료되지 않으면 해당 Thread의 콜 스택에 놓인 참조들은 GC 대상이 될 수 없고, 메모리 누수를 유발하게 됩니다.

 마지막으로 GC 구성 요소의 관리를 받지 못하는 비관리 메모리로부터 할당 받은 메모리는 직접 해제하는 코드를 작성해야 메모리 누수가 발생하지 않습니다.

 

반응형