2

시간이 지남에 따라 속도가 느려지는 모바일 응용 프로그램이 있습니다. 내 직감 (부분적으로는 this article으로 먹이를 먹었습니다)은 이것이 응용 프로그램을 느려지는 메모리 조각화 때문이지만 확실하지 않습니다. 다음은 시간이 지남에 따라 응용 프로그램의 메모리 사용의 꽤 그래프입니다 :조각난 메모리는 어떻게 생겼습니까?

fraggle rock http://kupio.com/image-dump/fragmented.png

그래프 4 개 피크 앱에 동일한 작업의 4 개 실행합니다. 나는 작업을 시작하고, 많은 양의 메모리를 할당하며, 약간 위에 앉아 (위에 평평한 선) 작업을 중단한다. 그 시점에서 System.gc()를 호출합니다. 메모리가 정리됩니다.

위에서 볼 수 있듯이 정확히 동일한 작업을 4 번 실행하는 데는 더 오래 걸립니다. 그래프의 낮은 점은 모두 같은 레벨로 돌아가므로 작업 실행 사이에 메모리 누수가없는 것처럼 보입니다.

내가 알고 싶은 것은, 메모리 조각화가 실현 가능한 설명인가, 아니면 내가 이미 많이 살펴 봤다는 것을 명심해야한다. 그래프의 낮은 점은 상대적으로 낮습니다. 따라서이 상태에서는 문제를 야기 할 수있는 작은 메모리 구멍이 많지 않으므로 메모리가 매우 세분화되지 않습니다.

j2me 메모리 할당자가 어떻게 작동하는지 모르겠으므로 실제로 알지 못합니다. 누구든지 조언 할 수 있습니까? 다른 사람이이 문제가 있었고 응용 프로그램의 메모리 프로필을 인식 했습니까?

+0

정상적인 Java VM은 가비지 수집 작업의 일부로 힙을 압축합니다 (조각화를 제거함). J2ME에 대해서는 확실하지 않습니다 ... – bdonlan

답변

1

당신은 약간의 시간, 당신은 메모리 풀 기법을 사용하여 메모리를 다시 사용하여 이론을 테스트 할 수있어 경우 작업 용도의 각 실행을 '같은'덩어리의 풀을 풀에서 꺼내 놓아서 풀어 놓을 때.

이 조사를 수행 한 후에도 성능이 저하되는 경우 문제를 일으키는 메모리 조각화가 아닙니다. 우리 모두가 귀하의 결과를 알게되며, 우리는 더 이상의 문제 해결을 도울 수 있습니다.

0

메모리 조각화가 원인 일 수 있습니다 ... 앱의 메모리 사용이 페이징을 유발하는지 여부는 분명하지 않습니다. 이것은 또한 일을 늦추고 .... 같은 문제를 일으킬 수 있습니다.

0

문제는 실제로 메모리 조각화이며, 그것에 대해 할 수있는 일이 많지 않습니다.

하지만 절망에 빠지기 전에 앱을 실행 프로필러로 실행하여 예기치 않은 곳에서 많은 시간을 보내고 있는지 확인하십시오. 속도 저하가 실제로 알고리즘의 문제로 인한 것이거나 메모리 조각화와 관련이없는 것일 수 있습니다. 사람들이 이미 말했듯이, J2ME 가비지 컬렉터는 단편화 문제로 고통 받아서는 안됩니다.

0

가비지 수집 통계를 살펴보십시오. 당신의 이론이 유지된다면 첫 번째 것보다 마지막 실행에 훨씬 더 많은 것을 가져야합니다. 또 다른 생각은 뭔가 다른 것들이 당신의 기억을 먹어 응용 프로그램이 적다는 것입니다. 즉

, 프로파일 시간 :

0

실행중인 OS는 무엇입니까? Windows CE5 (또는 Windows Mobile) 장치에 대한 경험이 있습니다. CE5의 운영 체제 수준의 메모리 아키텍처는 상당히 파괴되어 있으며 메모리 집약적 인 애플리케이션에서는 곧 실패 할 것입니다. 그래프에는 비늘이 없지만 모든 프로세스는 CE5에서 32MB의 주소 공간 만 가져옵니다. VM과 공유 라이브러리는 그것도 공평하게 사용하게 될 것이므로 거의 남겨 두지 않을 것입니다. 이 문제를 해결할 수있는 유일한 방법은 할당 된 메모리를 다시 수집기로 돌려 놓고 나중에 다시 할당하는 대신 다시 사용하는 것입니다.물론 이것은 Java에서 일반적으로 수행하는 것보다 훨씬 더 낮은 수준의 프로그래밍이지만,이 플랫폼에서는 운이 좋지 않을 수 있습니다.

관련 문제