2009-08-12 10 views
2

Ich habe eine mobile Anwendung, die im Laufe der Zeit Verlangsamung leidet. Meine Ahnung, (teilweise von this article gespeist,) ist, dass dies aufgrund der Fragmentierung des Speichers die App verlangsamt, aber ich bin mir nicht sicher. Hier ist eine ziemlich grafische Darstellung der Speichernutzung der App im Laufe der Zeit:Wie sieht fragmentiertes Gedächtnis aus?

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

Die vier Spitzen auf dem Diagramm sind vier Ausführungen der exakt gleichen Aufgabe auf der App. Ich beginne die Aufgabe, es teilt eine Menge Speicher zu, es sitzt für ein bisschen (die flache Linie an der Spitze) und dann höre ich die Aufgabe auf. An diesem Punkt ruft er System.gc() auf; und die Erinnerung wird aufgeräumt.

Wie zu sehen ist, dauert jeder der 4 Läufe der exakt gleichen Aufgabe länger. Die Tiefpunkte im Diagramm kehren alle auf das gleiche Niveau zurück, so dass zwischen den Task-Läufen keine Speicherlecks zu bestehen scheinen.

Was ich wissen will ist, ist Speicher Fragmentierung eine machbare Erklärung oder sollte ich zuerst woanders schauen, bedenkt, dass ich schon viel gesucht habe? Die Tiefpunkte im Graphen sind relativ niedrig, daher nehme ich an, dass der Speicher in diesem Zustand nicht sehr fragmentiert ist, da es nicht viele kleine Speicherlöcher geben kann, die Probleme verursachen.

Ich weiß nicht, wie der j2me Speicherzuordner funktioniert, also weiß ich wirklich nicht. Kann jemand beraten? Hat jemand anderes Probleme damit und erkennt das Speicherprofil der App?

+0

Die normale Java-VM komprimiert ihren Heap als Teil ihrer Garbage-Collection-Aufgaben (Entfernen von Fragmentierung) - nicht sicher über J2ME obwohl ... – bdonlan

Antwort

1

Wenn Sie ein wenig Zeit habe, können Sie Ihre Theorie unter Verwendung von Speicher-Pool-Techniken durch erneute Verwendung des Speichers testen können: jeder Lauf der Aufgabe Einsatzes die gleichen "Stücke" der Erinnerung, indem man sie aus dem Pool holt und zur Veröffentlichungszeit zurückgibt.

Wenn Sie nach dieser Untersuchung immer noch die verschlechternde Leistung sehen, ist es nicht die Speicherfragmentierung, die das Problem verursacht. Teilen Sie uns Ihre Ergebnisse mit und wir können Ihnen bei der weiteren Fehlerbehebung helfen.

0

Speicherfragmentierung würde dafür verantwortlich sein ... was nicht klar ist, ist, ob die Apps Nutzung von Speicher Paging verursacht? Dies würde auch die Dinge verlangsamen .... und könnte die gleichen Probleme verursachen.

0

Es ist das Problem wirklich Speicherfragmentierung, es gibt nicht viel, was Sie dagegen tun können.

Aber bevor Sie verzweifelt aufgeben, versuchen Sie, Ihre App mit einem Ausführungsprofiler auszuführen, um zu sehen, ob sie viel Zeit mit der Ausführung an einem unerwarteten Ort verbringen. Es ist möglich, dass die Verlangsamung tatsächlich auf ein Problem in Ihren Algorithmen zurückzuführen ist und nichts mit Speicherfragmentierung zu tun hat. Wie die Leute bereits gesagt haben, sollten J2ME-Müllsammler nicht unter Fragmentierungsproblemen leiden.

0

Betrachten Sie Garbage Collection-Statistiken. Sie sollten beim letzten Lauf viel mehr haben als beim ersten, wenn Ihre Theorie halten soll. Ein anderer Gedanke könnte sein, dass etwas anderes dein Gedächtnis frisst, so dass deine Anwendung weniger hat.

Mit anderen Worten, Profiler Zeit :)

0

Auf welchem ​​Betriebssystem betreiben Sie das? Ich habe Erfahrung mit Windows CE5 (oder Windows Mobile) Geräten. CE5s Speicherarchitektur auf Betriebssystemebene ist ziemlich kaputt und wird bald für speicherintensive Anwendungen fehlschlagen. Ihr Diagramm hat keine Maßstäbe, aber jeder Prozess erhält nur 32 MB Adressraum auf CE5. Die VM und die gemeinsam genutzten Bibliotheken werden ihren Teil dazu beitragen, so dass Sie nur noch wenig übrig haben. Die einzige Möglichkeit besteht darin, den zugewiesenen Speicher erneut zu verwenden, anstatt ihn dem Collector zurückzugeben und später neu zuzuweisen.Dies ist natürlich viel mehr Low-Level-Programmierung als Sie normalerweise in Java tun möchten, aber auf dieser Plattform können Sie Pech gehabt haben.