포럼
page_full_width" class="col-xs-12" |cond="$__Context->page_full_width">
XE의 메모리 누수가 심각합니다.
2012.01.22 16:17
Context 객체를 초기화하기 바로 직전까지 메모리 사용량이 4MB 정도 잡아먹고 있습니다.
물론 서버 플랫폼에 따라 다르게 나오겠지만 그만큼 메모리가 많이 새어나가고 있다는 소리입니다.
이에 여러가지 방안을 제시해 봅니다.
- include, require 줄이기
- ./config/config.inc.php 파일만 보아도 include 하는 파일이 많다는 것을 느낄 수 있었습니다.
DB class와 모듈 class를 불러들이는 것까지 포함한다면 적어도 수십개의 파일을 불러들이는 셈이 됩니다.
PHP5를 기반으로 최적화한다면 조금이나마 나아질 수 있기에 지금으로서는 생략합니다. - 전역변수($GLOBALS) 사용 줄이기
- 전역변수 : PHP 스크립트 어느곳에서든지 access 할 수 있는 변수.
- PHP 스크립트 어느곳에서든지 access 할 수 있다는 편리함 때문에 XE에서 자주 사용되고 있습니다.
하지만 전역변수는 지역변수보다 느리고 메모리 소모가 크기 때문에 다른 방법을 강구해야 합니다. - 모듈 instance 생성 시 언어 불러들이지 않도록 하기
- 불편하더라도 언어를 직접 불러들이게 된다면 불필요한 메모리 사용량을 줄일 수 있습니다.
module.xml에 action별(혹은 view/model/controller 등의 instance type)로 선언을 하여 언어를 불러들이도록 합니다.
단, 기존 모듈에 대한 호환성을 확보하기 위해 별도로 선언하지 않았다면 항상 불러들이도록 합니다. - 템플릿 엔진 최적화
- $lang = XE에서 사용되는 언어가 담긴 변수.
Context::set('변수이름', '값') = 템플릿 파일에서 사용할 변수를 선언하는 함수. - XE core 1.5에서 최적화가 이루어졌다고는 하나 여전히 메모리 누수는 심각합니다.
새로운 방안을 마련해야 합니다.
댓글 7
-
카르마
2012.01.22 18:32
1년전에도 한참 떠들었는데 아무도 관심을 안가져주더군요. -
SMaker
2012.01.22 18:57
메모리 누수 문제를 잡아야 속도 문제도 잡고 해외 진출에도 효과적일텐데 말이죠.. ㅎㅎ
-
쏭바강
2012.01.22 21:32
음 잘은 모르지만 코드가 문제가 많긴 한가보네요 ^^
-
misol
2012.01.22 23:08
이런거 많이 알려주세요 ㅠㅎㅎ
패치 제출하고 싶어요.
그런데 궁금한게 있는데, 전역변수 말고 static으로 함수 내에 저장해둔 변수가 메모리리를 더 잡아먹나요? 전역변수가 더 많이 먹나요?
둘 다 호출하면 불러올 수 있는건 같은데..
이런거 어떻게 비교할 수 있나요? -
SMaker
2012.01.23 00:36
글쎄요. 자세한 건 테스트 해봐야 알 것 같은데 추리해보면 정적변수가 좀 더 효율적이지 않을까 생각합니다.
전역변수 같은 경우 PHP 스크립트 어느곳에서나 접근할 수 있으니 메모리 사용이 정적변수(static)보다 많겠고요
정적변수는 함수 내에서만 유효하니 전역변수보다는 메모리 사용이 적을 것 같네요.
-
카르마
2012.01.23 11:29
지난번 공모전때문에 Backupxe개발할때 느꼈던 부분인데 db에 접속할때마다 메모리사용량이 꾸준히 증가하다가 메모리가 고갈되면 에러가 나더군요.
제추측으로는 처음 접속할때와 두번째이후에 접속할때의 절차를 다르게하는 방법이 필요할 것같더군요.....
for루프로 db에 접속하면서 메모리를 찍어보시기바랍니다. -
misol
2012.01.23 17:45
아하! 루프문이면 비교가 쉽겠군요! 고맙습니다