자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
안녕하세요. 저번에 질문을 올렸는데 이해가 안 되서 또 질문을 합니다...
https://opentutorials.org/course/3108/19310
험프리님이 말씀해주신데로 그대로 따라해 보아도. 메모리가 처음 시작 그 용량으로 돌아오질 않습니다.
저번에 답 주신 김원경 선생님의 말대로 폼 변수는 생성하지 않았습니다.
또, 동적 생성될 폼을 Availalbe forms으로 변경했습니다.
코드 입니다.
메인 폼의 폼 동적 생성 이벤트. (하나의 폼을 500회 생성 후 클로즈 이벤트 발생)
procedure TForm_Main.Button3Click(Sender: TObject);
var
i : integer;
begin
for i := 0 to 500 do begin
Form1 := TForm1.Create(Nil);
Form1.Show;
Form1.Close; //이것만 썻을 때는 모든 폼이 생성된 후에 모든 폼이 다같이 종료.
// Form1.Free; //이것도 같이 쓰면 생성 즉시 폼이 제거.
end;
end;
동적 생성폼(Form1)의 클로즈 이벤트.
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := CaFree;
Self := Nil;
end;
500회를 다 돌고나면 메모리 용량이 조금 줄어들기는 하는데 처음 실행시 용량으로 돌아가지 않습니다.
(메모리 확인은 작업관리자의 사용자 탭에서 메모리 카테고리에서 확인 했습니다.)
(추가로 작업 관리자 - 성능 - 리소스 모니터 - 메모리 탭에서도 메모리 사용량을 확인 했습니다. )
최초 실행시 1.9MB
500회 실행 후 3.5MB (실행 중간에는 4.0MB까지 증가)
2회 500회 실행 후 3.5MB (실행시 용량이 증가하나 종료된 후에 3.5MB로 돌아옴)
제가 원하는 것은 최초 실행시 1.9MB로 돌아가게끔 설계를 하고 싶은데... 1회 실행 후의 용량이 당연한 결과인가요?
제 추측으로는 500회 생성된 변수들이 사라지지 않고 재사용 되고 있기 때문에 3.5MB로 유지되는걸로 보입니다. 메모리에서 완전 해제하는 방법이 없는 것인가요?
여러군데 뒤져봐도 생성까지만 설명을 하고 해제에 대해서는 자세한 설명이 없어서 헤메고 있습니다.
귀찮게해드려서 죄송합니다... 너무 궁금한데 물어볼곳이 마땅히 없네요...
안녕하세요. 저번에 질문을 올렸는데 이해가 안 되서 또 질문을 합니다...
https://opentutorials.org/course/3108/19310
험프리님이 말씀해주신데로 그대로 따라해 보아도. 메모리가 처음 시작 그 용량으로 돌아오질 않습니다.
저번에 답 주신 김원경 선생님의 말대로 폼 변수는 생성하지 않았습니다.
또, 동적 생성될 폼을 Availalbe forms으로 변경했습니다.
코드 입니다.
메인 폼의 폼 동적 생성 이벤트. (하나의 폼을 500회 생성 후 클로즈 이벤트 발생)
procedure TForm_Main.Button3Click(Sender: TObject);
var
i : integer;
begin
for i := 0 to 500 do begin
Form1 := TForm1.Create(Nil);
Form1.Show;
Form1.Close; //이것만 썻을 때는 모든 폼이 생성된 후에 모든 폼이 다같이 종료.
// Form1.Free; //이것도 같이 쓰면 생성 즉시 폼이 제거.
end;
end;
동적 생성폼(Form1)의 클로즈 이벤트.
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := CaFree;
Self := Nil;
end;
500회를 다 돌고나면 메모리 용량이 조금 줄어들기는 하는데 처음 실행시 용량으로 돌아가지 않습니다.
(메모리 확인은 작업관리자의 사용자 탭에서 메모리 카테고리에서 확인 했습니다.)
(추가로 작업 관리자 - 성능 - 리소스 모니터 - 메모리 탭에서도 메모리 사용량을 확인 했습니다. )
최초 실행시 1.9MB
500회 실행 후 3.5MB (실행 중간에는 4.0MB까지 증가)
2회 500회 실행 후 3.5MB (실행시 용량이 증가하나 종료된 후에 3.5MB로 돌아옴)
제가 원하는 것은 최초 실행시 1.9MB로 돌아가게끔 설계를 하고 싶은데... 1회 실행 후의 용량이 당연한 결과인가요?
제 추측으로는 500회 생성된 변수들이 사라지지 않고 재사용 되고 있기 때문에 3.5MB로 유지되는걸로 보입니다. 메모리에서 완전 해제하는 방법이 없는 것인가요?
여러군데 뒤져봐도 생성까지만 설명을 하고 해제에 대해서는 자세한 설명이 없어서 헤메고 있습니다.
귀찮게해드려서 죄송합니다... 너무 궁금한데 물어볼곳이 마땅히 없네요...
최초 실행시 1.9MB
1회 500회 실행 후 3.5MB (실행 중간에는 4.0MB까지 증가)
2회 500회 실행 후 3.5MB (실행시 용량이 증가하나 종료된 후에 3.5MB로 돌아옴)
작성한 내용으로 보아 위와 같이 반복 작업을 수행해도 지속적인 메모리 증가(메모리 누수)가 없는 것으로 보입니다.
윈도우즈 메모리 관리 기법을 정확히 모르지만, 내부적으로 메모리를 효율적으로 사용하기 위해 재사용하는 것으로 보입니다.
저는 어떤 문제가 있는지 모르겠네요^^
메모리를 완전 해제하는 방법을 문의 주셨는데요.
원하는 기능을 구현해보시려면 델파이 메모리 매니저를 제어해야 할것 같습니다.
다음은 참고할 링크입니다. 델파이에 내장된 FastMM(오픈소스) 링크입니다.
https://github.com/pleriche/FastMM4
제의견을 말씀드리면,
1) 메모리 누수가 없다면 큰 문제가 없을 것으로 생각됩니다.
2) 과도하게 메모리를 사용한다고 생각들면 과도하게 사용하는 부분을 개선하는 것이 좋습니다.
3) 초기 실행시의 메모리 사용량으로 돌아가는 것은 그 목적을 먼저 생각하고 목적에 맞는 방법을 찾아보시기 바랍니다.
——————
답글이 도움이 되셨는지 다른 분들도 참고할 수 있도록 결과 댓글 부탁드립니다.
(결과 댓글이 없는 경우 다른 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)