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

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

... 46  47  48  49  50  51  52  53  [54]  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
1306이상현8/7/201410024Entity 프레임웍에서 테이블만 추가로 등록하는 방법
1307이상현8/7/201410326    답변글 [답변]: 자답이네요. [1]
1305popo8/7/201411571wpf UserControl List 바인딩 질문 입니다. [1]
1304민경수8/7/201414145네이버 카페에 구글 스프레드 시트 삽입 [1]
1303김동진8/7/201411386vmware환경에서 Guest IP를 192대역으로 받을 수 있는 방법은 없을까요~? [3]
1302김문경7/31/201410522스마트클라이언트 오라클 연결 [1]
1314이재균8/20/201410579    답변글 [답변]: 스마트클라이언트 오라클 연결
1300아로스7/28/201423440c# 인터넷 임시 파일 삭제 문의 [12]파일 다운로드1
1299서동원7/28/201412034안녕하세요. 혹시 Internet_Zone과 관련된문제인가 해서 질문드립니다. [1]
1298(non...7/25/201417415(글쓴이의 요청으로 삭제합니다.) [15]
1295서동원7/22/201413119안녕하세요. 스마트클라이언트에 대해 질문드립니다. [2]파일 다운로드1
1294(non...7/20/201411505(글쓴이의 요청으로 삭제합니다.) [2]
1293VS20...7/20/201412071VS2013 Ultimate에 Windows Phone 프로젝트 템플릿 추가 방법 문의 [1]파일 다운로드2
1292(non...7/20/201410839(글쓴이의 요청으로 삭제합니다.) [2]
1291zino7/16/201411429chromium 배포본 만들기~ [1]
1290(non...7/13/201412594(글쓴이의 요청으로 삭제합니다.) [3]
1288박주만7/8/201421753C# 서비스 기반 데이터베이스(mdf) & InstallShield Limited Edition 설치 및 배포 [2]파일 다운로드1
1287김용환7/8/201419753오라클 db 사용관련 문의입니다. [4]파일 다운로드1
1286C#조으다7/8/201410712WebBrowser 공유기 관리 웹 페이지 인증 [3]
1285C#조으다7/5/201411044IE DocumentComplete 이벤트가 발생되지 않습니다. [2]
1284(non...7/4/201411207(글쓴이의 요청으로 삭제합니다.) [3]
1283김영대7/3/201414297안녕하십니까 정성태님 죄송하지만 SmartClient 에 관한 질문이 있습니다. [9]
1282(non...7/2/201411164(글쓴이의 요청으로 삭제합니다.) [2]
1281(non...7/1/201412271(글쓴이의 요청으로 삭제합니다.) [4]
1280동동이6/25/201411474안녕하세요. ocx의 비동기 또는 쓰레드에서 호출 [1]
1279(non...6/23/201411550(글쓴이의 요청으로 삭제합니다.) [17]
... 46  47  48  49  50  51  52  53  [54]  55  56  57  58  59  60  ...