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

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

... 16  17  18  19  20  21  22  23  24  25  26  27  28  [29]  30  ...
NoWriterDateCnt.TitleFile(s)
5151이대희5/3/20197353C# 7.3으로 개정판 출간 계획이 있으신가요? [1]
5150김이현5/2/20198735C# 딕셔너리 생성에 대해 질문드립니다. [1]
5149민성5/1/20196980ftp 이미지 업로드중 [1]
5148wpf질문4/30/20197353특정 사이트를 wpf에서 popup을 항상 허용하게 할려면 어떻게 해야할까요? [5]
5147민성4/30/20196349wpf에서 작업관리자를 띠울려면 어떻게 해야 하나요? [1]
5146불파겐4/25/20196431하나의 필드를 여러 스레드에서 읽어갈 때 스레드 동기화를 하지 않으면 문제가 생길까요? [2]
5145e구름4/17/20199393Properties.Setting.Default값에 대해 질문드립니다. [2]
5144성태님 ...4/17/20196585질문하시기 전에 10000 페이지 오류 납니다. [1]
5143헌이4/16/20197519윈도우 작업표시줄에 프로그램 띄우기 [2]파일 다운로드1
5142cab2...4/9/201913085C#으로 만든 DLL 배포하기 [10]
5141하늘사랑4/5/20197987Axinterop 래퍼에 관해서 질문드립니다. [7]
5140게스트4/1/20197620안녕하세요. 초보 개발자입니다. SD리더기에서 SD카드를 꽂으면 발생하는 이벤트 문의 [2]
5139김이현3/28/201910830C#에서 CRON 같은 스케줄러를 사용하려면 어떻게 해야 하나요? [3]
5138김지원3/22/20198481유니티 쉐이더에서 오로지 포워드 애드 패스로만 만들 수 있을까요? [1]
5137세퉁3/22/201910409wpf 쓰레드에 대해 질문 있습니다. [4]
5136KGY3/13/20197074안녕하세요 닷넷코어 콘솔 프로그램 관련 질문입니다. [1]
5135러쎌3/13/20197527ASP.NET 공부 관련해서 문의를 드립니다. [1]
5134이정호3/12/20196924SampleProfiler 예제를 이용한 Class 객체의 접근 문의 [1]파일 다운로드1
5133ㅇㅇ3/12/20197802멀티코어사용 방법에 궁금한것이 있습니다. [3]
5132존기미3/3/20198057Physical Disk Access문의 [1]
5131강용규2/25/20197154c# 개발자입니다. 타이머 질문드립니다. [1]
5130노인코래방2/25/201910671C#에서 가장 좋은 성능을 보이는 파일 읽고 쓰는 방법이 무엇인가요? [2]
5129진우2/23/201910135닷넷 32비트 기반에서 메모리 부족으로 프로그램이 죽는경우 문의 [2]
5128게스트2/23/20197822안녕하세요. 초보개발자입니다. [3]파일 다운로드1
5127c#2/20/20196854책에 예제 문의드립니다. [2]
5125게스트2/19/20196941delegate를 활용한 event 를 적절히 불러오고 싶습니다. [2]
... 16  17  18  19  20  21  22  23  24  25  26  27  28  [29]  30  ...