(Würde) ein Kommentar sein, aber es ist zu lang dafür.)
Es ist ziemlich Routine für 4-Byte-Felder für "kurze" lokale vars verwendet werden, da die JVM konzeptionell eine Maschine mit 4-Byte-Register und mit allen ist Der andere Müll in einem Stack-Frame macht keinen großen Unterschied. Zum Beispiel ist es wahrscheinlich, dass es von dem Kompromiss abhängt, Speicher zu sparen, anstatt Zyklen auf Verbreiterung und Ausrichtung auszugeben - Verbreiterung kostet oft einen kleinen Zyklus und sogar auf Architekturen, die angeblich "agnostisch" in Bezug auf die Grenzausrichtung sind es gibt normalerweise eine Strafe für einen Zugriff außerhalb der Grenzen, so dass "Pack" -Felder, ohne sie zuerst neu anzuordnen, um Wort-/Doppelwortgrenzen zu erhalten, die Leistung kosten können.
Wenn also die JVM "packen" will, ist im Allgemeinen die Neuanordnung der Felder erforderlich. Naive JVMs vermeiden Neuanordnungen, da dies mehrere Aspekte der JVM vereinfacht, aber (als ein Beispiel) auf AS/400 fanden wir, dass aggressive Neuordnung und Komprimierung von Instanzfeldern in der Größenordnung von 30% Leistungsverbesserung für speicherhungrige Anwendungen gewonnen wurden.
Ich habe noch nie die Innereien von Dalvik angesehen. Standard-Sun-abgeleitete JVMs sind historisch (nicht zuletzt neu betrachtet) abhängig vom Layout/der Reihenfolge der Dinge in der .class-Datei und daher nicht "natürlich" für eine Neuanordnung geeignet. Aber Dalvik stellt die .class-Datei wieder her und ist daher besser in der Lage, die Neuanordnung von Instanzenfeldern durchzuführen.
Hinweis: Um die Hypothese zu testen, dass Dalvik short
Felder packt, müssen Sie eine Klasse mit mehreren Dutzend Instanzfeldern nacheinander erstellen und dann bestimmen, wie groß die resultierende Objektgröße ist. Erstellen Sie außerdem (unter der Annahme, dass die Packung im ersten Fall gesehen wird) eine Klasse mit den Feldern short
und int
(oder vielleicht long
), die interleaved sind, um zu sehen, ob Dalvik sie neu anordnet, um eine Packung zu erzielen.
An den Benutzer, der eine (Formatierung) Bearbeitung für meinen Beitrag vorbereitet: Danke. Leider ließ mich das System nicht akzeptieren, es hieß "Bearbeitung wurde bereits abgelehnt". Soweit ich mich erinnern kann, habe ich versucht, Ihre Änderungen selbst vorzunehmen. –
"Java Virtual Machines sind auch für die Verwendung von int-sized width für kurze Felder bekannt" Könnten Sie diese Aussage mit irgendeiner Referenz sichern? – kosa
Ich war dort ein bisschen ungenau, also habe ich es bearbeitet. Hier sind einige verwandte stackoverflow Themen: http://stackoverflow.com/questions/8855754/android-does-short-take-really-2-bytes http://stackoverflow.com/questions/1904857/which-is-better- to-use-short-or-int –