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.
java
.net
android
windows-phone-7
garbage-collection
Rei Miyasaka
quelle
quelle
Antworten:
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.
quelle
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 .
quelle
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.
quelle