Rest서버를 구현했는데 JSONObject에서 free를해도 메모리 누수가 계속 일어납니다ㅜ
조회수 895회
일단 질문을 읽어주시는분들게 고개숙여 감사를 드립니다.
delphi(tokyo)버전으로 pad서버를 구현중 여러 api를 만들고 성능테스트를 하는과정에서 메모리누수가 있고 서버가 죽어버려서 1개의 1api로만 테스트했을때의 메모리 릭 체킹중인데 어떤게 잘못되었는지 잘모르겠습니다. 사진은 ReportMemoryLeaksOnShutdown := true 으로 본 메모리 누수 결과입니다 좌측은 api 1개 우측은 jmeter로 1000번 request했을때의 결과입니다.
api 구성과 호출은 아래와같습니다. Main.pas 의 일부분 if (FN = 'getHosPet')then begin DM := TDM.Create(nil); try Ctxt.OutContent := StringToUTF8(DM.getHosPet(UTF8DecodeToUnicodeString(Ctxt.InContent),FN).ToString); Ctxt.OutContentType := JSON_CONTENT_TYPE; result := 200; finally freeAndNil(DM); end; end
DM은 TDM = class(TDataModule) 으로 되어있습니다. DM파일에서 getHosPet은
function getHosPet(context : string;FN : String) : TJSONObject; 이렇게 정의되어있습니다.
result.AddPair('code',TJSONNumber.Create(200)); result.AddPair('cmd' ,FN); result.AddPair('msg' ,objFind1); 로 되어있고 objFind1 은 TJSONObject 타입의 변수입니다. main.pas에서 DM의 function을 호출하여 값을 리턴받고 free와 nil값을 셋팅 해줘도 result로 받는 TJSONObject나 TJSONArray 들이 free가 안되는건지 1주일동안 자료를 찾아보고 TDataModule폼을 디자인타임이 없는 unit 파일로 바꾸어 사용해보아도 같은결과가 일어납니다. 또한 DM.pas에서 try finally를 사용하여 오브젝트들을 nil로 create하고 free해줘도 result값이 넘어오기 전이라 그런지 제대로 값이 넘어오지 않거나 혹은 엑세스바이얼레이션 에러가 납니다.
혹시 이부분에 대해 아시는분 있으시면 조언좀 부탁드립니다 ㅠ
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
본래 TList 에 담은 객체들을 모두 free 해줘야합니다.
TList 안에 TJSONObject 객체가 5개 있다면 각각 객체에 대해 5번 free 해줘야 한다는 겁니다.
TList 를 쓰지 말고 System.Generics.Collections.TObjectList 을 사용하세요
댓글 입력