Lange Redewendung: Ich kann tonnenweise nicht verwalteten Speicher zuweisen, aber wenn ich versuche, dieselbe Menge (oder weit weniger) im verwalteten Speicher zuzuweisen, stürzt MonoTouch in GC_remap ab (Aufruf unten).
Details:
Ich werde über ein Beispiel des oben beschriebenen Verhaltens sprechen. Meine App vergibt gelegentlich einen 2,5 MB großen Teil des verwalteten Speichers (mit neuem byte []), der oft auf meinem iPhone4 mit dem unten eingefügten Callstack endet (d. H. Mprotect error während der Zuweisung). Ich behalte einen Verweis auf diese 2,5 MB Blöcke nicht länger als einen einzelnen Funktionsaufruf.
Die MonoTouch-Leute sagen, dass 'mprotect errno 12' bedeutet, dass du ' Speicher auf Ihrem Gerät erschöpft zu sein , aber die Sache ist, ich habe viel Speicher für meine App verfügbar. Ich kann 0 MB , 10 MB oder 200 MB unmanaged Speicher (mit Marshal.AllocHGlobal) beim Start meiner App zuordnen , berühre es jeden Frame, und es macht keinen Unterschied im Verhalten meiner App oder in der Häufigkeit dieses mprotect-Fehlers.
Es gibt zwei Möglichkeiten, die Häufigkeit des Absturzes zu reduzieren oder zu beheben:
Aufgrund dieses Problems müssen wir die volle Stabilität in unserer App erreichen. Dieser Absturz (immer innerhalb von GC_remap) passiert in zufälligen Zuweisungen in unserer App (das 2.5MB Beispiel, das ich hier habe, ist nur das, das ich zu isolieren und zu repro).
Fragen:
Mein Team erwägt ernsthaft, MonoTouch für unser Produkt aufzugeben, weil wir es nicht zuverlässig stabil machen können.
Wir können die Uhrzeit auch nicht vom MonoTouch-Team im Stack-Overflow abrufen, indem wir Fehler auf der Novell-Website einreichen oder die Support-E-Mail von MonoTouch direkt per E-Mail senden. Wir haben unsere (verwaltete und nicht verwaltete) Speicherbelegung auf lächerliche Tiefstwerte reduziert, aber die App ist aufgrund dieses Problems immer noch unruhig.
Kurzfristig ist die einzige Problemumgehung, die ich mir vorgenommen habe, ein großer Speicherblock (2-5MB) beim Start zu reservieren, PIN so, dass der Müllsammler es nie berührt, und meinen eigenen Zuordner für dole zu schreiben teile Teile dieses Speicherblocks nach Bedarf zu meiner App aus. Aber wenn dies die beste Lösung ist, die unter MonoTouch möglich ist, werde ich mein Geld zurückbekommen, sobald ich die Escape-Geschwindigkeit von MonoTouch erreichen kann.
...
%Vor%Der Darwin-Kernel überbrückt Speicher.
Das heißt, wenn Sie 200 MB RAM anfordern, werden Sie sie erhalten, auch wenn sie nicht verfügbar sind, und solange Sie den Speicher nicht wirklich verbrauchen, wird Ihre Anwendung ausgeführt gut.
Nur wenn Sie tatsächlich auf die Seite schreiben, wird die Seite Ihrem Prozess zugewiesen.
Ein richtiger Test würde erfordern, dass Sie den Speicher zuweisen und dann den belegten Speicher auffüllen, deshalb haben Sie wahrscheinlich den Eindruck, dass Sie 200 MB Ram selbst dann zuweisen können, wenn Sie es nicht einmal haben.
Ein einfaches Programm zeigt Ihnen das: Versuchen Sie 500 MEG zuzuweisen, das Betriebssystem wird sagen "Ja, Sie haben es", aber es gibt keine iPhones mit dieser Art von Speicher.
Ein Beispiel-Testfall würde einen langen Weg zeigen, um zu zeigen, was das Problem ist.
Tags und Links ios4 iphone-sdk-3.0 xamarin.ios