본문 바로가기
Language/C#

[C#/WPF] 시리얼 통신 중 메모리 누수?

by 종승 2023. 3. 20.
1. 테스트용 시리얼 통신 프로그램을 디버깅 하는데 프로세스 메모리가 계속 증가하는 현상이 발생

 

Console.Writeline 메서드는 출력버퍼에 데이터를 저장하므로, 이 메서드를 반복적으로 사용할 경우 출력버퍼에 데이터가 계속 쌓여 메모리 누수가 발생할 수 있음

 

Console.Clear를 사용하여 출력 버퍼를 지워주는 방법 적용

 

 

2. Console.WriteLine 후 Console.Clear를 사용하게되면 수신한 데이터를 확인 할 수 없음

 

Console.SetCursorPosition 메서드를 사용해서 이전에 출력된 데이터의 시작 위치를 기억한 후 해당 다음 데이터는 해당 부분부터 출력될 수 있도록 수정

 

 

3. 출력은 원하는대로 잘 나오지만, 프로세스 메모리 증가는 해결되지 않음

 

SerialPort의 DataReceived 이벤트는 새로운 스레드에서 실행됨

 

그래서 이벤트 핸들러가 호출될 때 마다 새로운 스레드를 생성하여 실행하고, 스레드가 계속 증가하는 현상이 발생할 수 있음

 

 

4. 스레드를 생성해서 해당 스레드에서 반복적으로 데이터를 수신하도록 했는데, 프로세스 메모리 증가는 해결되지 않음

 

프로그램을 오래 실행시켜보니 일정 시간 이후 프로세스 메모리가 일정하게 유지됨

 

시리얼 통신을 처음 시작하면 프로그램이 데이터를 주고받는데 필요한 메모리 공간을 할당하게 됨
이 때 처음에는 메모리 할당과 해제가 발생하므로 메모리 사용량이 증가함
시간이 지날수록 통신에 필요한 메모리는 일정하게 유지되기 때문에 메모리 사용량이 더이상 증가하지 않음
(시리얼 통신에 필요한 메모리가 이미 할당되어 추가적인 할당 해제가 발생하지 않기 때문)

'Language > C#' 카테고리의 다른 글

[C#/WPF] Border를 Button처럼 사용하기  (0) 2023.03.23
[C#/WPF] IsMouseCaptured  (0) 2023.03.20
[C#/WPF] Trigger  (0) 2023.03.20
[C#/WPF] Style (TextBlock)  (0) 2023.03.10
[C#/WPF] ViewBox  (0) 2023.03.08