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

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

... 61  62  [63]  64  65  66  67  68  69  70  71  72  73  74  75  ...
NoWriterDateCnt.TitleFile(s)
1053폭풍코딩4/19/201216559스마트클라이언트 ctrl-c 복사가 작동하지 않습니다. [1]
1052에슈리온4/17/201232982ClickOnce 배포시 클라이언트의 설치경로를 지정할 수 없나요? [1]
1051최정수4/10/201219866WCF 클라이언트 비정상 종료 관련 [1]
1050에슈리온4/6/201222026관리자 권한과 ClickOnce, 그리고 Bootstrapper문제 [6]
1049김성혁4/4/201216621스마트클라이언트 stand-alone 방식의 배포 문제.. [1]
1048C#조으다3/27/201220177어셈블리 로드 / 언로드와 관련해서.. [6]
1047김우형3/23/201217755WCF 서비스를 이용한 데이터 전송 중 Exception 문의 [1]
1044임동찬2/29/201217622웹에서 COM Exception.. [2]
1043박성준2/24/201216161Lazy<T> 의 지연객체 생성 전에 실 객체의 Attribute분석 [2]파일 다운로드1
1042이성환2/20/201216589BlockingMethod에 빠진 스레드를 즉시 죽이고 싶습니다...;ㅅ; [2]파일 다운로드1
1039김재영2/15/201215918어셈블리에 사용자마다 다른 값을 적용하여 자동 빌드 방법이 있을까요? [2]
1037윈드로니2/12/201217349WPF 관련 질문 드립니다. [2]
1035임동찬2/9/201215702XML, XSD, XMLCodeGenerator 관련 [2]
1033곽성현2/7/201216229훔..윈도우 디바이스 드라이버 관련 [1]
1030궁빈2/2/201218652msbuild를 이용한 웹게시 및 자동 Dist 방법론에 대해 질문 드립니다!! [6]
1028신정환1/30/201215899기존 legacy Windows application이 WoA 환경에서 동작되지 않는 이유가 무얼까요? [2]
1026노현철1/19/201217886WPF가 XP에서 느리게 로딩되는 현상에 대해 질문드립니다. [4]
1025궁그미1/18/201218846네이버 소켓 로그인 이해가 안되는점이 있는데요 [2]
1022선무당1/11/201216894TFS 에서 공통 Assembly 공유 방법에 대해서 해결책이 없을까요? [2]
1021김재영1/8/201215972대리자를 메소드 파라메터로 넘겨도 됩니까? [2]파일 다운로드1
1019남산골11/13/201918583안녕하세요!! 성태님~~ [3]
1018강한구12/29/201121893WPF ClickOnce 배포시 콤포넌트 dll 다운로드 문제에 대하여 질문 있습니다. [1]
1017임동찬12/28/201118800smart client와 xbop, silverlight [6]
1015개똥이12/22/201116209RMCLOCK 설정 관련 질문이요ㅜ [2]
1011사길수12/16/201116272hyper-v 이더넷 카드 관련 문의 좀 드립니다. [1]
1006루로니12/13/201118396윈도우7과 XP의 DLL후킹 처리에 관해서 질문입니다. [3]
... 61  62  [63]  64  65  66  67  68  69  70  71  72  73  74  75  ...