Microsoft MVP성태의 닷넷 이야기
글쓴 사람
포플러 (myprimo at naver.com)
홈페이지
첨부 파일
 

안녕하세요?
저는 C#으로 이런저런 프로그램을 만들고 있는 직장인입니다.
이번에 회사에서 C#으로 프로그램을 개발하여 사용하고 있습니다.
그런데 평소에 잘 돌다가도 어느 순간 확 느려지는 현상이 있거나 화면이 멈춰버리는 현상이 일어납니다.
주기는 일정치 않으며 하루에도 한두번 나오거나 며칠에 나오거나 합니다.
하지만 프로그램을 지속적으로 많이 사용했을 때 나오긴 합니다.

메모리와 CPU를 체크해도 문제가 없어보입니다. 정상적인 CPU 사용량을 보이고 있고 메모리 할당도 안정적입니다.
그런데 작업관리자를 지켜보면 윈도우 핸들이 지속적으로 늘어나는 걸 볼 수 있습니다.
윈도우 핸들이 늘어난다는 건 아무래도 메모리 릭이 일어날 수 있다는 거겠지요?

프로그램의 구조를 간단히 말씀드리면 메인폼 한개와 팝업을 위한 공통폼을 가지고 있으면 나머지 화면들은 모두 UserControl로 생성하여 팝업을 호출할 때마다 UserControl을 동적으로 호출하여 컨트럴에 넣어줍니다.
팝업은 수시로 떴다 닫혔다를 반복하고 있습니다.
이러한 구조가 문제가 될 수 있을까요?

그리고 Entity를 Class로 생성하여 데이터를 주고 받고 하는데 이 때도 수시로 Instance가 생성되는데 이것 또한 윈도우 핸들 증가를 가져올 수 있을까요?

순간 멈춤이나 속도 느려짐이 도대체 어디에서 오는지 감이 오질 않네요. 메모리, 쓰레드, CPU는 작업관리자만 본다면 안정적인데 말이죠.

이리저리 찾아 보다가 이렇게 질문들 남깁니다.
프로그램 소스를 보지 않고서야 명확한 답변을 할 수 없겠지만서도 위와 같은 현상의 원인 어디에서 오는지 예상되는 생각이 있다면 답변 부탁드립니다.

감사합니다.








[최초 등록일: ]
[최종 수정일: 7/2/2017]


비밀번호

댓글 작성자
 



2017-07-02 02시17분
윈도우 핸들이 지속적으로 늘어나는 것은 분명 누수가 있다는 것이고 화면이 멈출 수 있습니다.

UserControl을 동적으로 생성한다고 했는데, 그럼 그 UserControl에 finalizer를 넣고 로그를 남겨보세요. 만약 로그가 남는다면 누수가 있긴 하지만 GC에 따라 그 시기만 늦춰지는 것이니 화면이 멈추는 정도까지는 가지 않을 수 있습니다. 반면 로그가 남지 않으면 분명히 해당 UserControl에 대한 인스턴스가 어떤 식으로든 풀리지 않는 것이기 때문에 심각한 누수에 해당합니다. (그렇긴 한데... 이상하군요. 보통 그런 경우 핸들과 함께 메모리도 늘어나야 정상인데.)

Entity가 문맥상 어떤 것인지 없어서 알 수 없지만 그냥 POCO class를 의미하거나 특별히 윈도우 자원을 담지 않는 것이라면 당연히 윈도우 핸들 증가와 상관없습니다.

윈도우 덤프를 분석하실 수 있다면 이런 경우 프로그램이 멈췄을 때 덤프를 남겨보세요.

코드(C#)를 통한 풀 덤프 만드는 방법
; http://www.sysnet.pe.kr/2/0/995

문제를 해결할 수 없다면 외부에서 기술 지원을 받는 것이 좋습니다. (가령, Microsoft의 경우에도 기술 지원을 제공하며, 대개의 경우 덤프를 떠서 보내달라고 합니다. - 물론, 유료입니다.)
정성태
2017-10-26 05시18분
[최닷넷] 폼 열고 닫고가 빈번하면 사용했던 리소스가 제대로 Dispose되거나 DBConnection 또는 IO가 제대로 Close되고 있거나
하는지를 체크해야 합니다. 맴버변수들은 특히 Form.Closing 이벤트 함수에 또는 Dispose를 구현하여 이부분들을 귀잖아도
작성해 주는게 좋습니다. 그리고 사용이 마무리된 맴버번수는 null로 다 활당해 주면 좋겠죠.
사용했던 리소스만 잘해도 좋은 성능을 보장받을수 있기때문에 객체의 생성자 만큼이나 소멸자에도 신경을 써주는게 좋겠습니다.
[guest]
2019-03-16 11시26분
[1234] c# 자체가 메모리를 많이 사용해서 데이터 베이스나 소켙을 장시간 사용시 보통 프로그램보다 리소스 낭비가 심합니다
c#에서는 시간이 많이 걸리거나 메모리를 크게 잡거나 반복해서 여러가지 폼이나 창을 자주 열었다 닫았다 하는게 안좋습니다
같은 창을 보였다 안보였다 하는게 낫죠 그리고 닫았다고 생각하지만 메모리가 안줄어들면 안 닫힌것일수도 있죠
[guest]
2019-03-18 09시24분
@1234 CLR이라는 VM의 운영 특성상 기본 메모리가 잡히는 것은 있지만 C# 자체가 메모리를 많이 사용한다는 말은 완전히 틀린 말입니다. VM 언어 계열 중에 C#(닷넷)만큼 메모리 활용이 좋은 것도 드물 것입니다.

그리고 데이터베이스나 소켓을 장시간 사용시 보통 프로그램보다 리소스 낭비가 심하다는 것도 틀립니다. 그런 건 대부분 느낌적인 부분에 해당하고 실제로는 일반적인 TCP/IP 자원 소비와 비교해 부하는 거의 없습니다. 단지 DataSet과 같이 편리하게 만들어진 타입들을 사용한다면 거기서 메모리 사용이 있겠지만 그걸 낭비라고 보기는 어렵습니다. DataSet과 같은 코드를 다른 언어에서 구현한다면 역시 동일하게 메모리 사용이 발생할 수 밖에 없습니다.

또한 시간이 많이 걸리거나 메모리를 크게 잡거나 반복해서 여러가지 폼이나 창을 자주 열었다 닫았다 하는 게 안 좋은 것은 분명히 코드 상에 메모리 릭을 발생하는 부분을 넣은 개발자의 잘못일 확률이 높습니다. 제대로 만들었다면 아무리 열었다 닫았다 해도 별 차이가 없습니다.

물론, 닷넷의 특성을 잘 이해하지 못해 발생하는 경우도 있습니다.

WPF의 Window 객체를 생성했는데 GC 수집 대상이 안 되는 이유
; http://www.sysnet.pe.kr/2/0/11310

위와 같은 식으로 모든 것들이 래핑되어 있기 때문에 내부를 모르게 되고 그 과정에서 누수가 발생할 확률이 C/C++와 같은 언어에 비해 큰 것입니다. 순수하게 다음의 코드에서 시작해,

윈도우 폼을 열고 닫는 것만으로 메모리 leak이 발생할까?
; http://www.sysnet.pe.kr/2/0/1142

자신의 코드를 추가하면 메모리 릭이 없습니다. 만약 발생한다면 대부분의 경우 그건 자신의 코드 잘못일 확률이 높습니다.
정성태

... 31  32  [33]  34  35  36  37  38  39  40  41  42  43  44  45  ...
NoWriterDateCnt.TitleFile(s)
5044엿장수8/20/20188402graphedit 에 등록되어있는 필터를 가져와서 사용하는방법을 알고싶습니다 [2]
5043hori...8/20/20188037Expression에 대한 책의 예제 관련하여 질문드립니다. [1]
5042황윤하8/20/20189757모드버스 TCP 관련 질문 [3]
5041david8/18/20189427.NET WebAPI 에서 Response 지연되는 이유 [3]
5040농상8/14/20188847정규표현식에 대해서 [3]
5039유영태8/14/201810427비동기 소켓사용후 해당 스레드가 남아있을때 처리 방법 [4]파일 다운로드1
5038이정석8/9/20188586서버파일 로컬파일 비교 [2]
5037jjh8/8/201811897c# 으로 화면캡쳐해서 동영상으로 만드는앱을 만들고싶습니다 [6]
5036볼딱지8/8/20189766C# programming 개발 관련 질문이 있습니다. [1]
5035궁금합니...8/8/201810371C# 버전 고민 어떤 책을 사야하나요? [1]
5034신동열8/8/20188831덤프 파일 분석 관련해서 문의 드려요. [1]
5033최규성8/7/201810938C# WinForm, Oracle 9i 로 프로그래밍시 ODP.NET, 배포 설정 방법 질문입니다. [6]
5032이정석8/6/201812745C# 으로 만들 dll 등록 [7]
5031J.S.8/6/20188374System.Array class의 구조에 대한 질문 [1]
5030농상8/4/20188898람다 식을 이용한 메서드 정의 확대를 공부하고 있습니다. [2]
5029Soul...8/3/20188415C# ActiveX 컨트롤 질문드립니다. [4]
5028도토리8/1/20188985혹시 회사에서 TFS 구축시 SQL-Server 라이선스 정책 아시는분 계신지요? [2]
5027농상7/31/20189761Freachable Queue의 발음을 표기하면 어떨까요? [2]
5026농상7/31/201812249소멸자의 이름에 대해서 [2]
5025김기철7/30/20189716selenium 질문좀 드릴개요 [3]
5024농상7/29/20188999패턴 매칭 when에 대해서 질문있습니다. [2]
5023농상7/28/201811957패턴매칭에 대해서 질문 있습니다. [1]
5022농상7/28/20188982튜플에 대해서 건의가 있습니다. [1]
5021농상7/27/20188471예외필터에 대해서 질문이요 [4]
5020농상7/27/201811337null 조건 연산자 예제에서 잠깐 혼동이 일어났습니다. [1]
5019농상7/26/201813643오버플로우와 언더플로우 [2]
... 31  32  [33]  34  35  36  37  38  39  40  41  42  43  44  45  ...