자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi DataSnap Server에 메모리 릭이 발생합니다.
2016.01.04 15:57
본 게시판 사용시 당부 사항
* 이 게시판은 자유롭게 질문을 올리고 자발적으로 답변을 공유하는 게시판입니다.
* 어느 누구도 답변을 달아야만 하는 책임은 없습니다.
* 따라서 질문을 올리실 때에는 최대한 자세하고 정중하게 질문을 올려 주세요.
* 최대한 질문을 자세히 올려야 답변도 자세히 올라 옵니다.
* 본 질문에 답변을 주시는 여러 개발자님들께 미리 감사드립니다.
-----------------------------------------------------------------------------------------------
관리자님 아래 글을 안보신 것 같아 부득이 다시 올립니다.
아래 글처럼 위저드로 DataSnap 서버하나 만들어서 테스트해서 결과를 알려주시면 감사하겠습니다.
### 아래 내용을 다시 올립니다 ###
델파이10 씨애틀 업데이트1을 사용하고 있습니다.
아래 처럼 단순하게 위저드로 DataSnap Server를 생성하여 빌드를 하고,
클라이언트에서 DataSnap으로 연결하면, 연결할 때 마다 윈도우작업관리자의 핸들이 계속 증가합니다.
-- 신규 어플리케이션 -- 위저드 실행
-- DataSnap Server
-> HTTP
-> 8085
-> 샘플 메소드 ... EchoString
* TServerModule
* VCL Form
위와 같이 위저드로 간단하게 서버를 생성해서 실행한 후 EchoString만 해도 릭이 발생하는데요.
윈도우 작업관리자에서 보면 핸들값이 계속 1씩 증가합니다.
또 구글 검색등에서 나오는 ...CreateInstance, ...DestroyInstance 이벤트 내용등을 설정해보거나
딕셔너리 등을 이용하여 TServerMethod 가 정상적으로 해제하도록 구현해도
핸들은 계속 늘어만 갑니다.
...
소스를 올리지 않는 것은 특별한 것이 없고 그냥 위저드에서 생성된 것이기 때문입니다.
// 감사합니다 //
댓글 5
-
험프리
2016.01.06 09:30
-
험프리
2016.01.08 18:12
말씀하신 구성으로 테스트 진행해봤습니다.
기본 설정으로 서버 만들고, 클라이언트는 타이머를 이용해 1초마다 EchoString 메소드를 호출했습니다.
procedure TForm2.Button2Click(Sender: TObject);
begin
Timer1.Enabled := True;
end;
procedure TForm2.Timer1Timer(Sender: TObject);
var
Method: TServerMethods1Client;
begin
Method := TServerMethods1Client.Create(SQLConnection1.DBXConnection);
try
Edit1.Text := Method.EchoString(DateTimeToStr(Now));
finally
Method.Free;
end;
end;
약 30분간 돌렸는데 메모리나, 핸들이 증가하지 않네요.
작성하는 코드나 테스트한 방법을 알려주시면 제가 해당 코드와 테스트방법으로 진행해 보겠습니다.
답변 부탁드립니다.
-
델사냥
2016.01.09 11:06
테스트 감사합니다.
제 질문에 서버인지 클라이언트인지 애매한 부분이 있네요. 죄송합니다.
....
올려주신 코드는 클라이언트에서 서버를 호출하는 코드인데요.
말씀하신대로 클라이언트에서는 문제가 발생하지 않습니다.
위저드로 새로운 DataSnap 서버를 만들고 올려주신 코드로 클라이언트에서 서버를 호출해도 서버의 핸들은 계속 증가합니다.
클라이언트에서 한두번만 서버를 호출해도 서버의 핸들이 늘어납니다.
혹시 위와 같이 서버를 호출했을 때 DataSnap 서버의 핸들값이 증가하는지 다시 한번 확인 부탁드립니다.
클라이언트가 아닌 서버의 핸들을 확인해주시면 감사하겠습니다.
주말 즐겁게 보내시고... 좋은 일만 가득한 해가 되시길 기원합니다.
-
험프리
2016.01.11 11:57
저는 서버와 클라이언트 2가지 프로세스 모두 메모리(개인 작업 집합)와 핸들이 증가하지 않았습니다.
혹시 환경이 다를까요?
참고로,
저는 서버와 클라이언트를 모두 제 개인 PC에서 돌렸습니다.
제가 테스트한 프로젝트로 테스트 부탁드립니다.
작성하신 코드도 올려주시면 저도 확인해 보도록 하겠습니다.
-
델사냥
2016.01.12 12:22
올려주신 자료로 테스트해도 마찬가지 입니다.
다음과 같이 테스트 했습니다.
> 윈도우 : 윈도우8, 64비트 / 윈도우7, 32비트
> 델파이 : 델파이10 씨애틀 업데이트1에서 올려주신 소스(서버, 클라이언트) 빌드
* 서버 실행
* 클라이언트
-- 클라이언트 실행
-- 윈도우 작업관리자에서 서버 프로세스 핸들 증가 (당연하겠지요)
-- 클라이언트가 계속 실행되는 동안에는 서버 핸들이 늘어나지 않음
-- 클라이언트를 종료하고, 다시 실행할 때마다 하면 서버 핸들이 증가
-- 소스를 약간 변경해서 클라이언트를 종료하지 않고, 버튼2 클릭(중지), 버튼1 클릭(실행)하면
서버 핸들이 계속 늘어남. (서버 프로그램에서 타임아웃과는 관련없을 것으로 생각합니다)
(버튼1 클릭)
SQLConnection1.Connected := True;
Timer1.Enabled := True;
(버튼2 클릭)
SQLConnection1.Connected := False;
Timer1.Enabled := False;
-- 클라이언트를 종료 -- 누적되었던 서버 핸들이 차감되어 표시됩니다.
-- 클라이언트를 실행 -- 위 테스트에서 누적되었던 서버 핸들 수에서 다시 증가합니다.
* 정리하면 DataSnap을 사용하기 위하여 클라이언트에서 SQLConnection을 연결하면 서버 핸들이 증가합니다.
// 감사합니다 //
Delphi DataSnap Server에 메모리 릭이 발생합니다.
2016.01.04 15:57
본 게시판 사용시 당부 사항
* 이 게시판은 자유롭게 질문을 올리고 자발적으로 답변을 공유하는 게시판입니다.
* 어느 누구도 답변을 달아야만 하는 책임은 없습니다.
* 따라서 질문을 올리실 때에는 최대한 자세하고 정중하게 질문을 올려 주세요.
* 최대한 질문을 자세히 올려야 답변도 자세히 올라 옵니다.
* 본 질문에 답변을 주시는 여러 개발자님들께 미리 감사드립니다.
-----------------------------------------------------------------------------------------------
관리자님 아래 글을 안보신 것 같아 부득이 다시 올립니다.
아래 글처럼 위저드로 DataSnap 서버하나 만들어서 테스트해서 결과를 알려주시면 감사하겠습니다.
### 아래 내용을 다시 올립니다 ###
델파이10 씨애틀 업데이트1을 사용하고 있습니다.
아래 처럼 단순하게 위저드로 DataSnap Server를 생성하여 빌드를 하고,
클라이언트에서 DataSnap으로 연결하면, 연결할 때 마다 윈도우작업관리자의 핸들이 계속 증가합니다.
-- 신규 어플리케이션 -- 위저드 실행
-- DataSnap Server
-> HTTP
-> 8085
-> 샘플 메소드 ... EchoString
* TServerModule
* VCL Form
위와 같이 위저드로 간단하게 서버를 생성해서 실행한 후 EchoString만 해도 릭이 발생하는데요.
윈도우 작업관리자에서 보면 핸들값이 계속 1씩 증가합니다.
또 구글 검색등에서 나오는 ...CreateInstance, ...DestroyInstance 이벤트 내용등을 설정해보거나
딕셔너리 등을 이용하여 TServerMethod 가 정상적으로 해제하도록 구현해도
핸들은 계속 늘어만 갑니다.
...
소스를 올리지 않는 것은 특별한 것이 없고 그냥 위저드에서 생성된 것이기 때문입니다.
// 감사합니다 //
댓글 5
-
험프리
2016.01.06 09:30
-
험프리
2016.01.08 18:12
말씀하신 구성으로 테스트 진행해봤습니다.
기본 설정으로 서버 만들고, 클라이언트는 타이머를 이용해 1초마다 EchoString 메소드를 호출했습니다.
procedure TForm2.Button2Click(Sender: TObject);
begin
Timer1.Enabled := True;
end;procedure TForm2.Timer1Timer(Sender: TObject);
var
Method: TServerMethods1Client;
begin
Method := TServerMethods1Client.Create(SQLConnection1.DBXConnection);
try
Edit1.Text := Method.EchoString(DateTimeToStr(Now));
finally
Method.Free;
end;
end;약 30분간 돌렸는데 메모리나, 핸들이 증가하지 않네요.
작성하는 코드나 테스트한 방법을 알려주시면 제가 해당 코드와 테스트방법으로 진행해 보겠습니다.
답변 부탁드립니다.
-
델사냥
2016.01.09 11:06
테스트 감사합니다.
제 질문에 서버인지 클라이언트인지 애매한 부분이 있네요. 죄송합니다.
....
올려주신 코드는 클라이언트에서 서버를 호출하는 코드인데요.
말씀하신대로 클라이언트에서는 문제가 발생하지 않습니다.
위저드로 새로운 DataSnap 서버를 만들고 올려주신 코드로 클라이언트에서 서버를 호출해도 서버의 핸들은 계속 증가합니다.
클라이언트에서 한두번만 서버를 호출해도 서버의 핸들이 늘어납니다.
혹시 위와 같이 서버를 호출했을 때 DataSnap 서버의 핸들값이 증가하는지 다시 한번 확인 부탁드립니다.
클라이언트가 아닌 서버의 핸들을 확인해주시면 감사하겠습니다.
주말 즐겁게 보내시고... 좋은 일만 가득한 해가 되시길 기원합니다.
-
험프리
2016.01.11 11:57
저는 서버와 클라이언트 2가지 프로세스 모두 메모리(개인 작업 집합)와 핸들이 증가하지 않았습니다.
혹시 환경이 다를까요?
참고로,
저는 서버와 클라이언트를 모두 제 개인 PC에서 돌렸습니다.
제가 테스트한 프로젝트로 테스트 부탁드립니다.
작성하신 코드도 올려주시면 저도 확인해 보도록 하겠습니다.
-
델사냥
2016.01.12 12:22
올려주신 자료로 테스트해도 마찬가지 입니다.
다음과 같이 테스트 했습니다.
> 윈도우 : 윈도우8, 64비트 / 윈도우7, 32비트
> 델파이 : 델파이10 씨애틀 업데이트1에서 올려주신 소스(서버, 클라이언트) 빌드
* 서버 실행
* 클라이언트
-- 클라이언트 실행
-- 윈도우 작업관리자에서 서버 프로세스 핸들 증가 (당연하겠지요)
-- 클라이언트가 계속 실행되는 동안에는 서버 핸들이 늘어나지 않음
-- 클라이언트를 종료하고, 다시 실행할 때마다 하면 서버 핸들이 증가
-- 소스를 약간 변경해서 클라이언트를 종료하지 않고, 버튼2 클릭(중지), 버튼1 클릭(실행)하면
서버 핸들이 계속 늘어남. (서버 프로그램에서 타임아웃과는 관련없을 것으로 생각합니다)
(버튼1 클릭)
SQLConnection1.Connected := True;
Timer1.Enabled := True;(버튼2 클릭)
SQLConnection1.Connected := False;
Timer1.Enabled := False;-- 클라이언트를 종료 -- 누적되었던 서버 핸들이 차감되어 표시됩니다.
-- 클라이언트를 실행 -- 위 테스트에서 누적되었던 서버 핸들 수에서 다시 증가합니다.
* 정리하면 DataSnap을 사용하기 위하여 클라이언트에서 SQLConnection을 연결하면 서버 핸들이 증가합니다.
// 감사합니다 //
이 부분은 제가 한번 살펴보도록 하겠습니다.
금주내에 답변 드리겠습니다.