Warum unterstützen mobile Plattformen keine Speicherbereinigung für Generationen?

11

Sowohl Windows Phone / Xbox als auch Android unterstützen die Speicherbereinigung von Generationen nicht. Dies ist für viele Programmierer frustrierend. Es scheint einen legitimen technischen Grund dafür zu geben, aber ich kann es nicht herausfinden.

Aktuelle Telefone haben mehr Speicher und wahrscheinlich bessere CPUs als die Desktops / Laptops, auf denen .NET 1.1 mit Generations-GC im Jahr 2001 ausgeführt wurde, und ich kann mir keine Gründe vorstellen, warum ARM-Prozessoren bei Generations-GC schlechter wären als x86. Multitasking auf Telefonen und Konsolen ist weniger erforderlich, sodass relativ mehr freier Heap-Speicherplatz zur Verfügung steht.

Also, was gibt es?

Bearbeiten: Einige Punkte zur Verdeutlichung:

  • Diese Plattformen verwenden die Garbage Collection ausschließlich für Apps. Meine Frage ist also nicht, warum GC nicht unterstützt wird. meine Frage ist , warum Generationen Garbage Collection nicht.
  • Der Grund, warum die Menschen über den Mangel an Generations-GC frustriert sind, ist, dass nicht-generrationale GC äußerst ineffizient ist. (Das bedeutet, dass die Akkulaufzeit nicht der Grund ist.)
  • Ich glaube, dass es einen ehrlichen technischen Grund für den Mangel an GC-Unterstützung für Generationen gibt. Dies ist keine rhetorische Frage.
Rei Miyasaka
quelle
Windows Phone (die aktuelle Generation) verfügt über eine Speicherbereinigung. Es läuft nur, wenn das Gerät wenig Speicher hat msdn.microsoft.com/en-us/library/gg490770.aspx
Tom Squires
@TomSquires Der GC auf WP7 wird tatsächlich alle 1 MB Zuweisungen ausgeführt. Ich denke, Sie denken vielleicht an den Task-Manager, der alte Prozesse kernet.
Rei Miyasaka

Antworten:

5

Ich denke, das größte Problem ist die Akkulaufzeit. Die Speicherbereinigung ist eine Annehmlichkeit für Entwickler, die zum Preis zusätzlicher CPU-Zyklen auf dem Computer des Benutzers gekauft wird . Wenn Ihre CPU angeschlossen ist (Desktop) oder über einen relativ großen Akku (Laptop) verfügt, sind Ihre Benutzer eher bereit, für den Komfort der Entwickler mit der zusätzlichen Energie zu bezahlen, die die CPU bei der Speicherbereinigung verbraucht. Wenn der Akku relativ klein ist, sind die Benutzer möglicherweise nicht so großzügig. Vielleicht möchten sie diese zusätzliche Bar für sich selbst - vielleicht um mit ihren Freunden zu sprechen oder um ein paar zusätzliche Schweine bei einer tödlichen Begegnung mit wütenden Vögeln zu töten.

Unabhängig von den Gründen der Benutzer möchten Betriebssystementwickler nicht den Eindruck erwecken, dass die Geräte, auf denen ihr Betriebssystem ausgeführt wird, den Akku schneller entladen als die Geräte, auf denen das Betriebssystem ihres Konkurrenten ausgeführt wird. So kaufen sie eine bessere Wahrnehmung der erwarteten Akkulaufzeit ihrer Geräte zum Preis der Bequemlichkeit der Entwickler: Für sie ist Ihr Schmerz keine große Sache, solange die Benutzer mit den Geräten zufrieden sind.

dasblinkenlight
quelle
3
Generational GC ist in den meisten Fällen tatsächlich viel effizienter, sodass Sie denken, dass es die Anzahl der Taktzyklen reduzieren würde. Es erklärt auch nicht, warum so etwas wie Xbox keine Generations-GC hat, weil Xboxes angeschlossen sind.
Rei Miyasaka
Genau das habe ich bei Stack Overflow gehört. Ich weiß allerdings nicht viel über XBox-es.
Dasblinkenlight
3
Das beantwortet die Frage immer noch nicht. Selbst wenn die Garbage Collection mehr Strom verbraucht als die explizite Zuweisung (was höchst umstritten ist - und ich werde nicht darauf eingehen), ist die Frage nicht, ob / warum die explizite Zuweisung besser ist als die GC auf Mobilgeräten, sondern ob / warum nicht Generations-GC ist besser als Generations-GC auf Mobilgeräten.
Rei Miyasaka
1
@Rei: Bei Spielen muss normalerweise alles deterministisch sein. Zumindest benötigen sie eine vorhersehbare Leistung. Ein paar Nanosekunden, die hier verschwendet werden, und ein paar Nanosekunden, die dort verschwendet werden - zu unvorhersehbaren Zeiten - können ein Spielerlebnis vermasseln. Generationsmüllsammler sind unvorhersehbar.
Ameise
2
@ Djacobson Ich glaube nicht, dass das stimmt. Wie ich in der Frage sagte, wenn es nur die Plattformen von Microsoft wären, die die Generations-GC vernachlässigen, wäre dies wahrscheinlich nur ein logistischer / bürokratischer Grund, und ich würde nicht danach fragen. Aber auch Android hat das gleiche Problem, daher ist dies wahrscheinlich ein technischer Grund, was bedeutet, dass jemand auf P.SE möglicherweise eine endgültige Antwort hat.
Rei Miyasaka
3

Meine beste Vermutung wäre, dass dies kein technischer Grund ist, sondern dass die Entwickler dieser Telefonplattformen sich noch nicht darum bemüht haben. Ich weiß, dass es nicht die Antwort ist, auf die Sie hoffen, aber wenn Sie eine mobile Entwicklung durchgeführt haben, haben Sie wahrscheinlich bemerkt, dass es viele niedrig hängende Früchte gibt. Sie hatten wahrscheinlich einfach nicht die Zeit, mehrere GC-Implementierungen zu schreiben, sie alle zu optimieren und diejenige auszuwählen, die am besten funktioniert. Warum sollte jemand Zeit damit verbringen, das Rad neu zu erfinden, wenn er stattdessen neue, auffällige, schlecht durchdachte APIs veröffentlichen könnte? ;)

FWIW und als Bestätigung meiner Theorie hat die neue Laufzeit (ART) von Android einen Generations-GC und sie planen, in Zukunft einen kompaktierenden GC zu haben .

aij
quelle
2

Die Speicherbereinigung von Generationen verursacht zusätzliche Kosten.

Der Generationskollektor muss herausfinden können, wann ältere Objekte auf neuere Objekte verweisen. Wir können das ältere Objekt nicht nachverfolgen, um diese Fälle zu finden, da dies den Zweck der Generationssammlung zunichte machen würde. Stattdessen müssen wir irgendwie erkennen, wann dies geschieht, und dies für die Erfassungsphase notieren. Unabhängig davon, wie Sie dies tun, erhöht dies den Erfassungsprozess.

Auf einem Desktop-System ist Ihr Betriebssystem damit beschäftigt, alle möglichen Dinge mit Speicher hinter den Kulissen zu tun. Es unterstützt Funktionen wie das Teilen von Seiten zwischen Prozessen, das Schreiben nicht verwendeter Seiten auf die Festplatte, das Bereitstellen einer Speicherzuordnung zwischen Prozessen usw. Meines Wissens nach ermöglichen einige der dort verwendeten Funktionen das effizientere Verfolgen geänderter Zeiger. Der Vorgang macht sich bereits Sorgen darüber, was Sie im Speicher ändern, sodass die Verwendung dieser Informationen für neue Zwecke kein Problem darstellt.

Ich vermute, dass mobile Systeme hinter den Kulissen nicht alle die gleichen Dinge tun. Infolgedessen verfügen sie nicht über die gleichen Informationen wie ein Desktop. Infolgedessen ist der Aufwand für die Implementierung einer allgemeinen Sammlung höher und weniger wahrscheinlich.

Winston Ewert
quelle
Um die GC-Generationen optimal nutzen zu können, müssen Schreibzäune verwendet werden, um zu erkennen, wann Objekte älterer Generationen geschrieben werden. Auf der anderen Seite würde ich denken, dass man die Leistung verbessern könnte, wenn der "Mark" -Teil des GC nicht von Generationen profitieren könnte, indem man nur Dinge in neueren Generationen bewegt (tatsächlich die "Tag" -Phase bei älteren Generationen als Neuere könnten nützlich sein, wenn man wissen könnte, wie viel wiedergewinnbarer Speicher in jeder Generation vorhanden ist.
Supercat