Ich habe eine PhoneGap App. Ein HTML5 Canvas-Spiel. Es scheint deutlich mehr Speicher in iOS 8 (einschließlich 8.0.2) gegenüber iOS 7 zu verwenden.
Zusätzlich zur Verwendung von mehr Speicher scheint der JS Garbage Collector den Speicher, den er hält, nicht freizugeben. Es wird "freigegebenen" Speicher korrekt gesammelt, aber niemals wieder freigegeben, damit iOS es verwenden kann.
Hier ist die Speicherbelegung unter Verwendung von Gerätezuteilungen unter iOS 7 mit einem iPhone 5S. Wie Sie sehen können, geht es beim Auf- und Abladen eines Levels rauf und runter. Auch die Speicherauslastung ist sehr gering, bei etwa 23 MB, maximal bei 41,81 MB
Hier ist die gleiche App, die auf einem iPhone 5S mit iOS 8.0.2 läuft. Wie Sie sehen können, sinkt die Speicherbelegung nie und es wird deutlich mehr Speicher benötigt. In der Tat steigt die Speicherauslastung für immer, während ich die gleiche Ebene lade und entlade. Es geht nicht so hoch, was mich denken lässt, dass JS Speicher aus dem Garbage Collector korrekt wiederverwenden wird, aber der GC scheint nie den Speicher freizugeben, den er an das Betriebssystem zurückhält. Auch scheint die gesamte App viel mehr Speicher zu nutzen als zuvor.
Die App läuft auch viel langsamer und erreichte 121 MB, als ich sie beendete.
Ich sollte hinzufügen, dass ich beim Entladen des Levels die Seite neu lade, was merkwürdigerweise keinen Speicher unter iOS 8 freigibt.
Hat jemand irgendwelche Ideen, was dieses Problem verursachen könnte und was die Lösung sein könnte? Ist das ein Fehler in iOS 8?
In 8.0 (aber nicht in 8.1) könnte man einen Workaround / hack nutzen: Aufruf von window.location.reload(true);
, bevor ein Seiten-Reload mit window.location.href =
erzwungen wird. Seit 8.1 funktioniert dieser Hack / Workaround nicht mehr.
Endlich gelöst.
PhoneGap verwendet standardmäßig UIWebView wegen eines Fehlers beim Laden von Dateien in WKWebView. Der obige Fehler tritt nur in UIWebView auf.
Ich habe das folgende Plugin installiert, das den Dateiladefehler in WKWebView behebt. Dies erlaubt mir, WKWebView zu verwenden, das den obigen Speicherfehler nicht hat.