문제

시간이 지남에 따라 느리게 고통받는 모바일 애플리케이션이 있습니다. 내 직감, (부분적으로 먹이를 먹었습니다 이 기사,) 이것은 메모리의 단편화가 앱을 늦추는 것이지만 확실하지 않습니다. 다음은 시간이 지남에 따라 앱의 메모리 사용에 대한 예쁜 그래프입니다.

Fraggle Rock http://kupio.com/image-dump/fragmented.png

그래프의 4 개의 피크는 앱에서 정확히 동일한 작업을 4 개의 실행입니다. 작업을 시작하고 메모리를 할당하고 약간 (위에 평평한 라인)를 만난 다음 작업을 중지합니다. 이 시점에서 그것은 system.gc ()를 호출합니다. 그리고 기억이 정리됩니다.

알 수 있듯이, 정확히 동일한 작업의 4 번의 실행은 실행하는 데 시간이 오래 걸립니다. 그래프의 낮은 점은 모두 동일한 레벨로 돌아 가므로 작업 실행 사이에 메모리 누출이없는 것 같습니다.

내가 알고 싶은 것은 메모리 파편화가 실현 가능한 설명입니까, 아니면 다른 곳을 먼저 봐야 하는가, 이미 많은 것을 보았다는 것을 명심해야합니까? 그래프의 낮은 점은 상대적으로 낮기 때문에이 상태에서는 문제를 일으킬 작은 메모리 구멍이 많을 수 없기 때문에 메모리가 그다지 파편화되지 않을 것이라고 가정합니다.

나는 J2ME 메모리 할당이 어떻게 작동하는지 모르겠으므로 정말로 모른다. 누구든지 조언 할 수 있습니까? 다른 사람이 이것에 문제가 있고 앱의 메모리 프로필을 인식합니까?

도움이 되었습니까?

해결책

약간의 시간이 있다면 메모리 풀 기술을 사용하여 메모리를 재사용하여 이론을 테스트 할 수 있습니다. 작업의 각 실행은 수영장에서 가져 와서 다시 메모리의 '동일한'덩어리를 사용합니다. 출시 시간에.

이 조사를 수행 한 후에도 여전히 성능이 저하 된 성능을보고 있다면 메모리 조각화가 문제를 일으키는 것이 아닙니다. 모든 결과를 알려 주시면 더 이상 문제를 해결할 수 있습니다.

다른 팁

메모리 조각화가 그것을 설명 할 것입니다 ... 명확하지 않은 것은 앱이 메모리를 사용하여 페이징을 일으키는 지 여부는 분명하지 않습니까? 이것은 또한 느려질 것입니다 .... 같은 문제를 일으킬 수 있습니다.

문제는 실제로 메모리 파편화입니다. 당신이 그것에 대해 할 수있는 일은 많지 않습니다.

그러나 절망을 포기하기 전에 Execution Profiler와 함께 앱을 실행하여 예상치 못한 장소에서 실행하는 데 많은 시간을 소비하는지 확인하십시오. 속도는 실제로 알고리즘의 문제로 인한 것일 수 있으며 메모리 조각화와 관련이 없습니다. 사람들이 이미 말했듯이 J2ME 쓰레기 수집가는 파편화 문제로 고통받지 않아야합니다.

쓰레기 수집 통계를 살펴보십시오. 당신의 이론이 보유한다면 첫 번째 달리기보다 더 많은 것을 가져야합니다. 또 다른 생각은 다른 것이 당신의 기억을 섭취하여 응용 프로그램이 적을 수 있다는 것입니다.

다시 말해, 프로파일 러 시간 :)

당신은 이것을 어떤 OS로 실행하고 있습니까? Windows CE5 (또는 Windows Mobile) 장치에 대한 경험이 있습니다. CE5의 운영 체제 레벨 메모리 아키텍처는 상당히 파손되어 메모리 집약적 인 응용 프로그램에 곧 실패 할 것입니다. 그래프에는 스케일이 없지만 모든 프로세스는 CE5에서 32MB의 주소 공간 만 얻습니다. VM과 공유 도서관은 그에 대한 공정한 점유율을 차지할 것입니다. 이 주위의 유일한 방법은 수집가에게 돌려주고 나중에 다시 할당하는 대신 할당 한 메모리를 재사용하는 것입니다. 물론 이것은 일반적으로 Java에서 원하는 것보다 훨씬 낮은 수준의 프로그래밍이지만이 플랫폼에서는 운이 좋지 않을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top