Forum: PC-Programmierung Warum brauchen Android Apps so viel Speicher


von Martin (Gast)


Lesenswert?

Hallo,

ich wollte mal einen Android-Insider fragen wieso Android Apps 
vergleichsweise (oder für die Funktion die sie bieten) so unglaublich 
viel Speicher brauchen.

z.B. Telegram App. Ohne die Daten die die App sonst speichert 41 MB.
Das ist einfach nur ne Messenger App die zum Großteil eh auf Zeugs vom 
System aufbaut. Wie kommt man da auf so viel Speicher?

Genauso die Spotify App mit 170MB.
So viel braucht Spotify nichtmal auf meinem Desktop.

Vielleicht kann mal jemand aufklären woran das liegt.

Danke

: Verschoben durch User
von alf (Gast)


Lesenswert?

Ich weis jetzt auch nicht woran das liegt, aber wenn du dir mal die 
Facebook-App anschaust, erscheint der Speicherfraß deiner genannten Apps 
vernachlässigbar. Umso erstaunlicher ist, dass der Speicher bezahlbarer 
Smartphones und Tablets immer noch ziemlich mikrig ist.

von (prx) A. K. (prx)


Lesenswert?

In einem Fall ist mir der Grund bekannt. Bei einem Küchentimer, der die 
Restzeit links oben in der Statusleiste anzeigt. Die App selbst ist 
eigentlich recht, aber ...

Im Prinzip sind das einfach bloss Ziffern, die runterzählen. Toteinfach 
also. Denkste. Geht nämlich nicht so einfach. In der Statusleiste sind 
nur Icons möglich. Also enthält die App hunderte einzelner Icons, je 
eines für 59min, 58,5min, 58min, ..., 59sec, 58sec, ...

: Bearbeitet durch User
von alf (Gast)


Lesenswert?

Ja jetzt kommen gleich wieder Einwände dass doch niemand mehr Facebook 
nutzt und man die App und den Messenger ohnehin nicht braucht...
Trotzdem steigen die Nutzerzahlen, auch in Deutschland, ständig.

von Rolf Magnus (Gast)


Lesenswert?

alf schrieb:
> Umso erstaunlicher ist, dass der Speicher bezahlbarer Smartphones und
> Tablets immer noch ziemlich mikrig ist.

Findest du? Moderne Geräte haben doch heute teils schon 3 oder 4 GB RAM 
und kommen mit 64 Bit, weil man sonst den ganzen Speicher gar nicht mehr 
angesprochen kriegt. Auf einem PC kann man damit erheblich mehr anfange 
als auf dem Handy.
Ich hab mich auch schon gefragt, warum meine Taschenlampen-App, die nix 
macht, ausser einen Button anzuzeigen, mit dem man das Fotolicht an oder 
aus machen kann, 2 MB braucht, also mehr als 30 mal soviel, wie ein C64 
insgesamt hatte.

von Markus F. (mfro)


Lesenswert?

Android Apps sind Java-Applikationen (die so etwas wie shared Libraries 
z.B. nicht kennen). Somit schon "per Design" umfangreicher als unbedingt 
notwendig.

Falls sie sich ein bisschen flotter bewegen sollen, bringen sie u.U. 
nativen Code in Form eines C/C++ Kompilats für JNI mit. Und weil das 
unabhängig vom tatsächlich verbauten Prozessor funktionieren soll, liegt 
der JNI-Code u.U. noch für mehrere Prozessoren vor.

... aber was hat das mit Compilern und IDEs für µC zu tun?

von Jay (Gast)


Lesenswert?

Markus F. schrieb:
> Android Apps sind Java-Applikationen (die so etwas wie shared
> Libraries
> z.B. nicht kennen). Somit schon "per Design" umfangreicher als unbedingt
> notwendig.

Jein. Die Android VM läd einen Haufen Klassen (mehrere tausend 
Systemklassen) vorauseilend beim Booten. Ein Grund warum Android so 
langsam bootet ...

Jede App die ausgeführt wird erhält eine copy-on-write Referenz auf die 
vorauseilend geladenen Klassen. Das heißt, alle Apps teilen sich erst 
einmal ein und den selben Satz der Systemklassen. Nur wenn eine App eine 
dieser Klassen benutze und die Benutzung zu einer Schreibaktion führt, 
wird der betroffene Speicherbereich für diese App kopiert 
(copy-on-write).

Das heißt, die Systemklassen verhalten sich wie Shared Libraries.

von Markus (Gast)


Lesenswert?

Was mich beim Speicherbedarf unter Android wundert:
Die eigentliche apk ist einige hundert kB groß, nach Start veranschlagt 
sie aber im Speicher mehrere MB. Wieso?
(ist mir bei unterschiedlichen Anwendungen aufgefallen)

von Axel S. (a-za-z0-9)


Lesenswert?

Markus schrieb:
> Was mich beim Speicherbedarf unter Android wundert:
> Die eigentliche apk ist einige hundert kB groß, nach Start veranschlagt
> sie aber im Speicher mehrere MB. Wieso?

Weil das falsch gezählt wird. Die JVM und Systemklassen die das 
Betriebssystem schon mitbringt, werden halt für jede laufende App 
einzeln mitgezählt, auch wenn sie in Wirklichkeit geteilt sind und der 
Linux-Kernel darunter das schön säuberlich mit COW auseinanderfizzelt.

Aber natürlich ist die Verwendung einer JVM an sich schon Bloat ohne 
Ende und ein Grund dafür, warum ein Smartphone heute zwanzigmal so viel 
Speicher und hundertmal soviel Rechenleistung braucht wie ein C64.

von Peter II (Gast)


Lesenswert?

Jay schrieb:
> Nur wenn eine App eine
> dieser Klassen benutze und die Benutzung zu einer Schreibaktion führt,
> wird der betroffene Speicherbereich für diese App kopiert

wie meist du das? Klassen können doch gar nicht beschrieben werden. Es 
könne nur Objekte davon gebildet werden und ich kann mir nicht 
vorstellen das sich verschieden Apps Objekte sharen.

von Christian M. (Gast)


Lesenswert?

Und warum brauchen auch selbst die simpelsten Windows-Programme 
Megabytes? Fragen über Fragen, die man sich nicht erklären kann, vor 
allem, wenn man schon selbst programmiert hat!

Ich habe schon bei einigen Softwareentwicklern nachgefragt, da kriegst 
natürlich keine Antwort!

Gruss Chregu

von Peter II (Gast)


Lesenswert?

Christian M. schrieb:
> Und warum brauchen auch selbst die simpelsten Windows-Programme
> Megabytes? Fragen über Fragen, die man sich nicht erklären kann, vor
> allem, wenn man schon selbst programmiert hat!

Notepad brauch 2Mbyte
WinMerge 5Mbyte
Word 2010 16Mbyte


finde ich jetzt nicht wirklich viel

von Karl (Gast)


Lesenswert?

Peter II schrieb:
> Word 2010 16Mbyte

Wo hast du die Zahl denn her?

von Christian M. (Gast)


Lesenswert?

Peter II schrieb:
> finde ich jetzt nicht wirklich viel

Du bist noch jung, oder?

Gruss Chregu

von Falk B. (falk)


Lesenswert?

@ Axel Schwenke (a-za-z0-9)

>Aber natürlich ist die Verwendung einer JVM an sich schon Bloat ohne
>Ende und ein Grund dafür, warum ein Smartphone heute zwanzigmal so viel
>Speicher und hundertmal soviel Rechenleistung braucht wie ein C64.

Leider wahr :-(

von Falk B. (falk)


Lesenswert?

"Warum brauchen Android Apps so viel Speicher?"

Na weil sie nicht in Moby-Assembler programmiert sind! ;-)

von Peter II (Gast)


Lesenswert?

Karl schrieb:
> Peter II schrieb:
>> Word 2010 16Mbyte
>
> Wo hast du die Zahl denn her?

aus dem Taskmanger  - kein Dokument offen

Peter II schrieb:
> > finde ich jetzt nicht wirklich viel
> Du bist noch jung, oder?
> Gruss Chregu
nein, leider nicht mehr und mein erstes System hatte nur 1Mbyte Ram.

Mir erschreckt aber auch der Verbrauch von Android - wozu brauch ein 
Handy 2GB ram, wenn einige noch mit XP und 1GB ram komplett ihre Büro 
machen.

von Karl (Gast)


Lesenswert?

Peter II schrieb:
>> Wo hast du die Zahl denn her?
>
> aus dem Taskmanger  - kein Dokument offen

Das sind bei mir a) 50 MB und b) nur der verwendete Arbeitsspeicher, hat 
also nichts mit der Größe der Anwendung zu tun. Das Office hat bei mir 
1,2 GB, was ich schon als groß bezeichnen würde.

von (prx) A. K. (prx)


Lesenswert?

Peter II schrieb:
> Mir erschreckt aber auch der Verbrauch von Android - wozu brauch ein
> Handy 2GB ram, wenn einige noch mit XP und 1GB ram komplett ihre Büro
> machen.

Beim PC werden Anwendungen gestartet, genutzt und wieder beendet. 
Vielleicht sind da auch mal ein paar gleichzeitig im Speicher, aber nie 
alle.

Bei der vorgesehenen Nutzung von Smartphones werden Apps eigentlich 
nicht beendet, sondern nur verlassen. Sie bleiben dann im letzten 
Zustand im RAM liegen und werden weggeräumt, wenn Platz benötigt wird.

Als man in Android noch entsprechende Info-Tools nutzen konnte, also vor 
V5, drängte sich mir der Eindruck auf, dass beim Start von Android 
sämtliche Apps mindestens rudimentär gestartet werden, und dann erst 
einmal im Speicher rumliegen.

von Eric B. (beric)


Lesenswert?

Peter II schrieb:
> Peter II schrieb:
>> > finde ich jetzt nicht wirklich viel
>> Du bist noch jung, oder?
>> Gruss Chregu
> nein, leider nicht mehr und mein erstes System hatte nur 1Mbyte Ram.

Also doch jung ;-) Mein erstes System hatte gerade mal 1kB! (Sinclair 
ZX81)

von Rolf Magnus (Gast)


Lesenswert?

Axel S. schrieb:
> Aber natürlich ist die Verwendung einer JVM an sich schon Bloat ohne
> Ende und ein Grund dafür, warum ein Smartphone heute zwanzigmal so viel
> Speicher und hundertmal soviel Rechenleistung braucht wie ein C64.

Die Zahlen sind deutlich zu niedrig. Realistischer wären 50.000 mal so 
viel Speicher und Rechenleistung wie ein C64.

von Jay (Gast)


Lesenswert?

Peter II schrieb:
> wie meist du das? Klassen können doch gar nicht beschrieben werden.

Doch, Stichwort static.

> Es
> könne nur Objekte davon gebildet werden und ich kann mir nicht
> vorstellen das sich verschieden Apps Objekte sharen.

Doch, solange sie nach der Initialisierung bei Systemstart nicht 
verändert werden, werden sie geteilt. Schreibt eine App, bekommt sie 
durch copy-on-write ihre eigene Kopie, in die dann geschrieben wird.

von Peter II (Gast)


Lesenswert?

Jay schrieb:
> Peter II schrieb:
>> wie meist du das? Klassen können doch gar nicht beschrieben werden.
> Doch, Stichwort static.

Static wird immer initialisiert. Das erfordernd also immer ein 
schreibzugriff wenn die Klasse benutzt wird.
Und wo kommt denn in den Systemklasse static Variablen vor?

von Bernd (Gast)


Lesenswert?

Neulich im Supermarkt:

"Oma, warum brauchen Android Apps so viel Speicher?"

"Damit Google dich besser finden kann!"

von Peter II (Gast)


Lesenswert?

Jay schrieb:
>> Es
>> könne nur Objekte davon gebildet werden und ich kann mir nicht
>> vorstellen das sich verschieden Apps Objekte sharen.
>
> Doch, solange sie nach der Initialisierung bei Systemstart nicht
> verändert werden, werden sie geteilt.

Objekte geteilt? Das kann doch gar nicht gehen, denn Objekte haben einen 
Konstructor die muss immer ausgeführt werden. Und wird immer etwas 
geschrieben.

Wenn es wirklich so ist, würde Handys nicht so viel Speicher brauchen.

von Jay (Gast)


Lesenswert?

Peter II schrieb:
> Objekte geteilt? Das kann doch gar nicht gehen, denn Objekte haben einen
> Konstructor die muss immer ausgeführt werden. Und wird immer etwas
> geschrieben.

Der einmal bei Systemstart ausgeführt wird. Es gibt im Android-System 
haufenweise Objekte, die das System beim Start erzeugt und auf die Apps 
später Zugriff haben. Zum Beispiel die ganzen Manager.

> Wenn es wirklich so ist, würde Handys nicht so viel Speicher brauchen.

Wenn du unbedingt meinst das ich lüge muss ich mir ja keine Mühe mehr 
mit Erklärungen geben.

von Peter II (Gast)


Lesenswert?

Jay schrieb:
> Der einmal bei Systemstart ausgeführt wird. Es gibt im Android-System
> haufenweise Objekte, die das System beim Start erzeugt und auf die Apps
> später Zugriff haben. Zum Beispiel die ganzen Manager.

das glaube ich ja gerne, diese Objekte müssen auch nur einmal da sein - 
weil echte Resoucen nur einmal vorhanden sind. Aber die Manager werden 
auch nicht kopiert - würde ja kein sinn machen. Es sind die gleichen 
Objekte oder nicht?

Hast du ein Beispiel für ein Objekt was ein Read-only-Clone ist und beim 
schreiben kopiert wird?

von Daniel A. (daniel-a)


Lesenswert?

Peter II schrieb:
> Objekte geteilt? Das kann doch gar nicht gehen, denn Objekte haben einen
> Konstructor die muss immer ausgeführt werden. Und wird immer etwas
> geschrieben.

In Java gibt es einen ConstantPool, dieser enthält die Werte primitiver 
Datentypen, Strings (sind immutable), Methodennamen, Classennamen, etc. 
Der ConstantPool und der Code kann zur Runtime nicht verändert werden. 
Diesen teil muss man also nicht mehrfach laden. Ich sehe das Problem 
eher bei "new" und dem Garbage Collector. Ständig werden im Heap objekte 
Allociiert welche dann eventuell weitere Objekte Instanzieren. Das 
Summiert sich dann.

PS: Es gibt es Libraries die den ConstantPool absichtlich verändern um 
die Classen zu manipulieren, und dann gibt es SecurityManager um 
derartiges zu Kontrollieren/Verhindern.

von asd (Gast)


Lesenswert?

Da es Apps gibt die 500kB brauchen und welche mit 50MB ohne dass der 
Unterschied durch den Funktionsumfang erklärbar wäre vermute ich dass 
das nicht an Java oder Android an sich sondern mehr an der verwendeten 
Entwicklungsumgebung liegt.

von Wolfgang S. (ws01)


Lesenswert?

Christian M. schrieb:
> Und warum brauchen auch selbst die simpelsten Windows-Programme
> Megabytes?

Brauchen sie nicht.  Die simpelsten Windows-Programme brauchen Kilobytes 
im zweistelligen Bereich, die etwas größeren im dreistelligen. Der nicht 
ganz triviale Dependency-Walker, beispielsweise, ist rund 500 KByte 
gross, die Kompaktversion des Editors SciTE 788 KByte.

Android-Programme übrigens auch nicht.  Vor ein paar Jahren habe ich mir 
Torch von Colin McDonough 
(https://github.com/Crossbones/android_packages_apps_Torch-OLD) selber 
übersetzt, weil ich eine Taschenlampen app brauchte und weil das i.W. 
dasselbe leistet wie Dutzende von Taschenlampenapps im Playstore, die 
zum Leuchten nicht nur Megabytes brauchen, sondern z.B. auch mein 
Adressbuch lesen können müssen. Das .apk ist 26 KByte groß, der 
Anwendungsmanager zeigt bei Benutzung einen Speicherbedarf von unter 60 
KByte.

Warum andere ziemlich einfach aussehende Programme unter Windows oder 
Android trotzdem Megabytes brauchen, ist vielen Fällen recht einfach zu 
erklären.  Da werkeln halt Emulatoren und/oder Frameworks, z.T. auch 
mehrere übereinandergetürmt. Warum etwas neu implementieren, wenn der 
relevante Code oder Teile davon schon existieren, aber halt nicht in 
Java formuliert?

Ein Beispiel.  Mein Bulls&Cows-Calculator 
(https://play.google.com/store/apps/details?id=de.mystrobl.mmcalc1) ist 
im Grunde nicht mehr als eine Grafik, hinter der ein ziemlich trivialer 
Algorithmus (ein Mastermind-Solver) werkelt.  Das Ganze ist eine 
Simulation eines Programms, das ursprünglich in einem PIC 16F84 ablief, 
also mit 2 K Worten Programmspeicher und 68 Bytes RAM auskam.

Warum ist das .APK unter Android dann 3 MByte groß (Faktor 1500) und 
braucht im Betrieb dann sogar Speicher in erschreckend hohem Umfang, 
nämlich fast 10 MByte?

Ganz einfach, das ist gar keine Java-Anwendung, das ist eine 
Python-Anwendung, die sich der Pygame-Library bedient, um das GUI zu 
realisieren. Also muß der Python-Interpreter (ein C-Programm, das mit 
Mitteln des NDK in in ARM-Code übersetzt wurde, nebst seinen div. 
Supportlibraries, soweit sie benutzt wurden) mit in das .apk 
hineingepackt werden, sowie natürlich auch die Pygame-Library.  Der 
wesentliche Teil, der Mastermind-Solver nebst der GUI-Logik (also 
Interpretation der Tasten und das Zeichnen der Segmente), ist ein 
lediglich 8 KByte großes Script bzw etwa 5 KB in der in Python-Bytecode 
übersetzten Form, sowie ein Font (88 KByte), diverse Grafik (zusammen 
rund 400 KByte) und ein Midi-File (145 Byte).

Warum das dann aber zehn MByte braucht und nicht nur drei (oder sechs), 
läßt sich auch erklären, dafür müsste man weiter ausholen und das führte 
dann wirklich etwas zu weit. :-)


> Fragen über Fragen, die man sich nicht erklären kann, vor
> allem, wenn man schon selbst programmiert hat!

Vielleicht hilft die obige Erklärung ja schon ein wenig weiter. Wobei 
man nicht dem Irrtum unterliegen sollte, dies sei die einzige mögliche 
Erklärung für "Bloat".  Es ist eine von vielen.

>
> Ich habe schon bei einigen Softwareentwicklern nachgefragt, da kriegst
> natürlich keine Antwort!

Vielleicht die falschen Leute gefragt.

von Wolfgang S. (ws01)


Lesenswert?

Peter II schrieb:
> Christian M. schrieb:
>> Und warum brauchen auch selbst die simpelsten Windows-Programme
>> Megabytes? Fragen über Fragen, die man sich nicht erklären kann, vor
>> allem, wenn man schon selbst programmiert hat!
>
> Notepad brauch 2Mbyte

notepad.exe unter Windows 8.1 x64 (deutsch) ist exakt 216 KB groß, also 
nur ein Zehntel so groß.

Und das ist schon erstaunlich viel, denn angefangen hat der unter 
Windows NT mit 50 KByte.  Als Quelle kann ich mich selber zitieren, 1993 
schrieb ich in comp.sys.sgi.misc

In <1o7uai...@fido.asd.sgi.com> mt...@mycool.asd.sgi.com (Michael Toy) 
writes:

>1. From what I've seen (I have two machines in my office running NT,
>   one MIPS and one 486) NT is as big or bigger then IRIX.
>2. NT is still beta software, maybe they will fix that eventually.
>3. People (even me) keep complaining about software bloat, but it
>   is interesting that two similarly powerful operating systems
>   (Modern UNIX and Windows NT) are also of similar size.

This may apply to the OS itself, but it definitly doesn't apply
to the application programs. One example: I always wondered why
the "jot" editor takes so much longer to load on my fast 50MHz
R4000 Indigo than the notepad editor on my slowly 25 MHz NT-PC.
Both editors are more or less equally powerfull (-less, that is),
but jot needs about five times as long to load.

Well, the answer is simple: notepad.exe on the October 92 NT PDK
is about 50 KByte, while jot amounts to more than 670 KByte. Now I
don't doubt that the 0.5 G SCSI disk on the Indigo is faster than
the cheap 0.15 G IDE drive in the PC, but it surely isn't more than
ten times faster.

https://groups.google.com/forum/message/raw?msg=comp.sys.sgi.misc/Z9NWB4gBlYU/YE96BPx9_jkJ

N.B. Man sieht, software bloat war auch vor 23 Jahren schon ein Thema.

von Gustl B. (-gb-)


Lesenswert?

Hach auf dem Motorola MPx200 haben das komplette Windows Mobile 2003 
samt Office Mobile und diversen Programmen wie Internet Explorer, 
Kalender, SMS Programm, Outlook, Videoplayer (TCPMP), Spielen 
(Bubblebreaker), Windowsmediaplayer und dazu noch Benutzerdaten in 32 
MByte Flash gepasst. Das konnte man noch mit SD-Karte erweitern, aber 
krass was da alles so ging.

von Scelumbro (Gast)


Lesenswert?

Martin schrieb:
> ich wollte mal einen Android-Insider fragen wieso Android Apps
> vergleichsweise (oder für die Funktion die sie bieten) so unglaublich
> viel Speicher brauchen.

Das erste Problem heißt Java (ist nunmal nicht das schnellste oder 
schlankeste Pferd im Programmiersprachenstall), das Größere sind aber 
die für die Anwendungsentwicklung verwendeten Frameworks. Die alle alles 
möglichst einfach, Anfängertauglich und natürlich plattformübergreifend 
(also für iOS, Android und vielleicht sogar Windows Phone einsetzbar) 
bieten sollen. Dabei wird dann lustig eine Abstraktionsschicht auf die 
andere gesetzt. Dieses ganze Geraffel hängt dann natürlich im Speicher 
rum und verbraucht Platz - und Rechenleistung, denn das Programm muss 
sich für jeden Funktionalität durch dutzende Wrappermethoden kämpfen bis 
mal endlich was passiert.

Ich habe nie verstanden warum man bei Android auf Java  gesetzt hat. 
Plattformunabhängigkeit hätte man auch Problemlos erreichen können in 
dem das SDK für die vorherrschenden Prozessoren automatisch Binaries 
kompiliert und der Appstore die jeweils richtige ausliefert (oder von 
mir aus alle zusammen in einer APK sind). Man könnte die verschiedenen 
Fähigkeiten der ARM Prozessoren durch ein entsprechendes Framework + 
hochoptimierende Compiler imho viel besser nutzen.

von Dussel (Gast)


Lesenswert?

Bei meinem ersten Kontakt mit Java hat mir das schon nicht gefallen. Die 
Programmierer sparen sich Zeit und Ärger, indem sie eine einfache statt 
einer effizienten Sprache benutzen und bezahlen darf es der Nutzer durch 
unnötig leistungsfähige Hardware
Ist das jetzt eingetreten oder habe ich das falsch rausgelesen?

von D. I. (Gast)


Lesenswert?

Dussel schrieb:
> Bei meinem ersten Kontakt mit Java hat mir das schon nicht gefallen. Die
> Programmierer sparen sich Zeit und Ärger, indem sie eine einfache statt
> einer effizienten Sprache benutzen und bezahlen darf es der Nutzer durch
> unnötig leistungsfähige Hardware
> Ist das jetzt eingetreten oder habe ich das falsch rausgelesen?

Hardware ist im Vergleich zu Entwicklungsstunden billig und schlechten 
Code kriegt man mit jeder Sprache hin.

von Dussel (Gast)


Lesenswert?

D. I. schrieb:
> Hardware ist im Vergleich zu Entwicklungsstunden billig
Nur dass die Entwicklungsstunden nur einmal bezahlt werden müssen, 
während die Hardware tausend- oder millionenfach gekauft werden muss.
Das heißt also, du stimmst mir zu.

von Michael M. (do7tla)


Lesenswert?

Java war schon immer extremst Speicherfressend und lahm!
Egal ob auf PC, Spielkonsole, Settopbox oder Smartphone.

: Bearbeitet durch User
von D. I. (Gast)


Lesenswert?

Dussel schrieb:
> Nur dass die Entwicklungsstunden nur einmal bezahlt werden müssen,
> während die Hardware tausend- oder millionenfach gekauft werden muss.
> Das heißt also, du stimmst mir zu.

Nicht gänzlich. Die Hardware (Smartphone/Tablet) wird ja nicht 
ausschließlich für eine App angeschafft, wohingegen man als Anbieter 
100% der Entwicklungstunden in eine App steckt.

von Noch einer (Gast)


Lesenswert?

> Nur dass die Entwicklungsstunden nur einmal bezahlt werden müssen

Nicht unter Android. Da gibt es für jedes Problemchen 100 Apps. Besser 
wäre, die 100 Entwickler tun sich zusammen, entwickeln eine kompakte, 
schnelle, fehlerfreie App. Oder noch besser; die 10 Enthusiasten 
entwickeln eine App und der ganze Rest, der mit Werbung und Bloatware 
Kohle machen will, fliegt aus dem Appstrore raus.

Übrigens - bei der Hardware hast du den selben Effekt. Wenn du die 
Entwicklerstunden für die Chips auf die produzierten Stückzahlen 
umlegst, kommen nur Bruchteile eines Cents heraus. Bei Milliarden von 
Smartphones werden die GB-Cips billiger als damals die kB-Chips für die 
Homecomputer.

von Borislav B. (boris_b)


Lesenswert?

Scelumbro schrieb:
> Ich habe nie verstanden warum man bei Android auf Java  gesetzt hat.
> Plattformunabhängigkeit hätte man auch Problemlos erreichen können in
> dem das SDK für die vorherrschenden Prozessoren automatisch Binaries
> kompiliert und der Appstore die jeweils richtige ausliefert

So wird es doch im Prinzip gemacht. Nur dass der Compile-Vorgang auf dem 
Smartphone selber ausgeführt wird. Am Ende bleibt aber eine native 
Binary, die genau für den Prozessor des ausführenden Geräts kompiliert 
wurde.

von Noch einer (Gast)


Lesenswert?

> Am Ende bleibt aber eine native Binary

Soweit ich weiß, erst seit Android 5.0 mit ART. Dalvic war ein 
Interpreter mit JIT. Nur dummerweise hat ART es kaum Auswirkungen auf 
Speicherverbrauch und Geschwindigkeit.

Andere Idee... Apache Xalan wurde mal 1:1 von Java nach C++ übersetzt. 
Die Leute hatten sich damals gewundert. Der C++ Code ergab den selben 
Speicherverbrauch und die selbe Geschwindigkeit wie der Java JIT.

Problem ist der Java-Zwischencode mit all seinen Arrayüberprüfungen, 
Castüberprüfungen, Überprüfungen auf nicht initialisierte Variablen und 
seiner dynamischen Speicherverwaltung. Ein C Programmierer weiß was er 
tut, braucht den ganzen Overhead nicht. Aber wenn er in C ein Android 
Programm schreibt, bauen ihm Zwischencode und ART den ganzen Overhead 
der idiotensicheren Java Runtime ein.

von Peter II (Gast)


Lesenswert?

Noch einer schrieb:
> Problem ist der Java-Zwischencode mit all seinen Arrayüberprüfungen,
> Castüberprüfungen, Überprüfungen auf nicht initialisierte Variablen und
> seiner dynamischen Speicherverwaltung.

so Prüfungen kosten nur Zeit aber fast kein RAM. Das kann nicht wirklich 
das Problem sein.
Ich vermute viel mehr das Problem "Speicher-Freigeben" Bei C++ ist klar 
definiert wenn ein Objekt zerstört wird, bei JAVA kümmert sich der GC 
asynchron darum. Es muss für jedes Objekt noch eine Refernzzähler und 
ähnliche Dinge mitgescheppt werden - das kostet halt speicher.

von Noch einer (Gast)


Lesenswert?

> aber fast kein RAM

Bei einem Interpreter nicht. Ein Compiler dagegen baut zusätzliche 
Maschinenbefehle für Arraygrenzen und Casts ein.

Und bei C++ ist die Speicherfreigabe extrem schnell - normalerweise nur 
Stackpointer zurück setzen. Die wenigsten Objekte werden auf dem Heap 
angelegt.

Weiß jemand, ob Android Objekte auf dem Stack erlaubt?

von Peter II (Gast)


Lesenswert?

Noch einer schrieb:
>> aber fast kein RAM
>
> Bei einem Interpreter nicht. Ein Compiler dagegen baut zusätzliche
> Maschinenbefehle für Arraygrenzen und Casts ein.

aber nicht für jedes Objekt, sondern für eine Klasse. Code ist meist 
nicht mehrfach vorhanden.

von dash button (Gast)


Lesenswert?

G++ (5.2) kann mittlerweile sehr viel optimieren.

Der Java compiler (gibt es überhaupt mehrere freie?) macht 0,0 
Optimierung und übersetzt den Code 1:1.
Sehr schwache Leistung von Goo*gle.

von Peter II (Gast)


Lesenswert?

dash button schrieb:
> G++ (5.2) kann mittlerweile sehr viel optimieren.
>
> Der Java compiler (gibt es überhaupt mehrere freie?) macht 0,0
> Optimierung und übersetzt den Code 1:1.
> Sehr schwache Leistung von Goo*gle.

so ein Unsinn.

Java kann grundsätzlich sogar noch mehr optimieren als jeder C(++) 
Compiler. Bei JIT optimieren sie zur Laufzeit und sehen damit z.b. 
Variablen die von außen reinkommen. Wogegen bei C++ üblicherweise 
statischen Code erzeugt wird.

Wenn JAVA langsam ist, liegt es bestimmt nicht am Compiler, sondern an 
den Möglichkeiten die JAVA bietet. (z.b. Reflexion).

von Peter II (Gast)


Lesenswert?

Der Overhead in Objekte ist doch recht stark:


http://stackoverflow.com/questions/258120/what-is-the-memory-consumption-of-an-object-in-java
[...]
Object headers and Object references

In a modern 64-bit JDK, an object has a 12-byte header, padded to a 
multiple of 8 bytes, so the minimum object size is 16 bytes. For 32-bit 
JVMs, the overhead is 8 bytes, padded to a multiple of 4 bytes. (From 
Dmitry Spikhalskiy's answer, Jayen's answer, and JavaWorld.)
[...]

Wenn für jedes Objekt wirklich 12byte overhead drauf gehen, dann sollte 
klar sein warum Java so viel ram braucht.

von efsrwr446 (Gast)


Lesenswert?

Im Eingang ging es um code size.
Und da könnte man eine Menge rausholen, wenn der java Compiler so gut 
wäre wie der GCC.

Sieht man ja schon, wieviel proguard rausholen kann. Von der Optimierung 
her ist das aber ein Witz ggü. GCC.

Übrigens kann dies auch Obfuscation Versuche zu nichte machen; selber 
schon erlebt dass Debug Strings noch im Code sind, obwohl die Log 
Methode leer ist (mit proguard).


Korrekt wäre eine statische Voroptimierung + die Optimierungen die auf 
dem Gerät geschehen. Das würde sicherlich auch die Installationszeit 
heruntersetzten.

Bleibt bei Google Watch eigentlich der Zeiger stehen, während eine App 
installiert wird? Bei den alten Schrottprozessoren würde mich das nicht 
wundern. :D

von Markus K. (markus-)


Lesenswert?

Peter II schrieb:

> Java kann grundsätzlich sogar noch mehr optimieren als jeder C(++)
> Compiler. Bei JIT optimieren sie zur Laufzeit und sehen damit z.b.
> Variablen die von außen reinkommen. Wogegen bei C++ üblicherweise
> statischen Code erzeugt wird.

Es gibt in C++ schon lange die Möglichkeit des Profile Guided 
Optimization. Da füttert man das Programm mit typischen Daten und der 
Compiler optimiert dann daraufhin. Ist natürlich nicht so optimal wie 
wenn man das zur Laufzeit macht, aber dafür kostet die Analyse und 
Optimierung auch keine Laufzeit.

von (prx) A. K. (prx)


Lesenswert?

Noch einer schrieb:
> Ein C Programmierer weiß was er tut, braucht den ganzen Overhead nicht.

Merkt man. An den mittlerweile fast schon täglichen eintrudelnden 
Panikmeldungen über sicherheitskritische Buffer Overflows.

von (prx) A. K. (prx)


Lesenswert?

Wenn Java und die Runtime-Techniken von Android an allem Schuld haben, 
wieso sind dann in iPhones sehr leistungsfähige Prozessoren mit viel RAM 
verbaut?

: Bearbeitet durch User
von efsrwr446 (Gast)


Lesenswert?

Peter II schrieb:
> Wenn JAVA langsam ist, liegt es bestimmt nicht am Compiler, sondern an
> den Möglichkeiten die JAVA bietet. (z.b. Reflexion).

Hier z.B. das fehlende Caching von Member Variablen:
http://pastebin.com/GQevG4pT

Warum sollte man sowas erst auf dem Gerät oder noch schlimmer zur 
Laufzeit optimieren? Falls das überhaupt geschieht..

War schon überrascht, dass der Konstantenzugriff wegoptimiert wurde.

von Peter II (Gast)


Lesenswert?

efsrwr446 schrieb:
> Hier z.B. das fehlende Caching von Member Variablen:
> http://pastebin.com/GQevG4pT

eventuell sind ja bei Java alles Variablen volatile

von W.S. (Gast)


Lesenswert?

Christian M. schrieb:
> Und warum brauchen auch selbst die simpelsten Windows-Programme
> Megabytes? Fragen über Fragen, die man sich nicht erklären kann, vor
> allem, wenn man schon selbst programmiert hat!
>
> Ich habe schon bei einigen Softwareentwicklern nachgefragt, da kriegst
> natürlich keine Antwort!

Dann kriegst du hiermit eine von mir: Weil den meisten 
Software-Entwicklern der Codeumfang egal ist - und weil ein dicker 
Brocken viel imposanter aussieht als ein schlankes Programm.

Beispiel: Hexapad.exe (ein Datei-Hexeditor) kommt mit 74 KByte daher und 
ist eine durchaus nicht ganz simple grafische Windows-Anwendung. Grund 
für diese Schlankheit ist die Verwendung von KOL zum Delphi. Damit kann 
man tatsächlich schlanke grafische Anwendungen schreiben, die lediglich 
ihre .exe brauchen und keinerlei dicke im Hintergrund lauernde 
Runtime-DLL's. Also es geht. Aber warum benutzen die Leute das nicht? 
Siehe oben. Je fetter, desto mehr Ruhm für den Programmierer.

Und zu den Android-Apps: Das sind durchweg gepackte Archive im 
Zipformat. Da gibt es keinen lad- und ausführbaren Code, sondern nur 
Gepacktes. Also braucht es zu dem Zipfile auch noch mindestens doppelt 
so viel freien RAM, um darin die enthaltenen eigentlichen Programme und 
Daten auszupacken. Häufig genug ist das jedoch wiederum ein Sammelsurium 
von Zip-gepackten Dateien, die wiederum vor Verwendung ausgepackt werden 
müssen.

Tja, ZIP ist ja als Pack- und Archivierungsformat sehr schön, aber 
besser wäre es allemal gewesen, für Android-Anwendungen ein eigenes 
ungepacktes Dateiformat zu kreieren, was man nur einmal in den RAM laden 
muß und von dort aus ohne zusätzliche Entpackerei abarbeiten kann. 
Microsoft's EXE Format ist da ein gutes Beispiel, ELF ginge bis auf 
dieRessourcenfrage ebenfalls. Ist aber nicht. Und deswegen wird bei 
Android lustig entpackt auf Teufel komm raus. Das ist übrigens auch 
einer der Gründe, weswegen alles Androidzeug für vergleichbare Leistung 
wesentlich mehr an Hardware-Ressourcen braucht als WinCE-Zeugs. Ein Navi 
mit WinCE, 128 MB Ram und 400 MHz ARM ohne GPU funktioniert - eines mit 
Android würde bei der HW-Ausstattung unbenutzbar lahm sein.

W.S.

von (prx) A. K. (prx)


Lesenswert?

Androids APK ist das Installationsformat. Also das Äquivalent zu den 
ebenfalls komprimierten Containern MSI, RPM etc. Nicht das 
Laufzeitformat. Die APKs werden nicht einfach ins Flash geschoben und 
fertig, sondern bei der Installation passiert was. Schon vor ART.

: Bearbeitet durch User
von W.S. (Gast)


Lesenswert?

A. K. schrieb:
> Nicht das
> Laufzeitformat.

Ach - und welches wäre das deiner Meinung nach?

W.S.

von (prx) A. K. (prx)


Lesenswert?

W.S. schrieb:
> mit WinCE, 128 MB Ram und 400 MHz ARM ohne GPU funktioniert - eines mit
> Android würde bei der HW-Ausstattung unbenutzbar lahm sein.

Äpfel und Birnen...

Ein Einsteigerhandy von anno Android 2.3 hatte einen 600 MHz ARM11 mit 
256MB RAM drin und für die Programme standen um die 150MB Flash zur 
Verfügung. Und schon damals war WinCE uralt.

Geräte wachsen mit den Möglichkeiten der Zeit. Wenn man zum gleichen 
Preis wie früher mehr RAM einbauen kann, da wird dieses RAM recht bald 
auch gebraucht. Dieses eherne Gesetz der PC-Branche gilt auch bei 
Smartphones. Egal auf welchem System es aufbaut.

Wenn man dann Geräte verschiedener Generationen miteinander vergleicht, 
dann wird man völlig unabhängig vom Basissystem "völlig erstaunt" 
feststellen, dass neuere Geräte viel mehr Ressourcen verbrauchen als 
alte.

von (prx) A. K. (prx)


Lesenswert?

W.S. schrieb:
> Ach - und welches wäre das deiner Meinung nach?

Jenseits der Installation sind es je nach Runtime optimierte DEX Files 
(Dalvik), oder ELF Files (ART).

http://anandtech.com/show/8231/a-closer-look-at-android-runtime-art-in-android-l/

Manche Apps verwenden auch in Android vom Entwickler erzeugten nativen 
Code. Liegt der nur als ARM Binary vor, es steckt aber ein Intel 
Prozessor drin, wird das zur Laufzeit dynamisch übersetzt (Houdini).

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Noch einer schrieb:

> Ein C Programmierer weiß was er
> tut, braucht den ganzen Overhead nicht.

Ja genau...

Und wie erklärst du dann die quasi unendliche Zahl von Sicherheitslücken 
in C-Programmen? Also z.B. so Sachen wie buffer- und integer overflows, 
zeropointer-Zugriffe, double free Fehler usw. usf...

von H. K. (spearfish)


Lesenswert?

Dussel schrieb:
> Bei meinem ersten Kontakt mit Java hat mir das schon nicht gefallen. Die
> Programmierer sparen sich Zeit und Ärger, indem sie eine einfache statt
> einer effizienten Sprache benutzen und bezahlen darf es der Nutzer durch
> unnötig leistungsfähige Hardware
> Ist das jetzt eingetreten oder habe ich das falsch rausgelesen?

Dass auch "schlechte" Programmierer halbwegs lesbaren Code produzieren 
und keine unnötigen Bugs einbauen ist eigentlich ein Qualitätsmerkmal 
(auch wenn das bei Java nicht so ganz verwirklich ist...).

Java wird ja hauptsächlich im Enterprisebereich eingesetzt. Und ob der 
(virtuelle) Server, auf dem das Servlet läuft, jetzt 128GB oder 512GB 
RAM hat, ist bei vielen schon unter der Wahrnehmungsgrenze... ;)
Viel wichtiger ist bei solchen Enterpriseapplikationen dagegen, dass 
auch bei fluktuierenden Entwicklern der Code les- und damit wartbar 
bleibt.

Es sind einfach vollkommen andere Anforderungen. Niemand wird Java (bzw. 
das Ökosystem Java) für ein embedded system einsetzen. Aber C ist/war 
auch nie dafür gedacht z.B. COBOL zu ersetzen.
Verschiedene Programmiersprachen/Laufzeitumgebungen haben verschiedene 
Einsatzzwecke. Und man muss eben oftmals einen Trade-Off verschiedener 
Eigenschaften eingehen, um das optimale Ergebnis zu erzielen.

Noch einer schrieb:
> Problem ist der Java-Zwischencode mit all seinen Arrayüberprüfungen,
> Castüberprüfungen, Überprüfungen auf nicht initialisierte Variablen und
> seiner dynamischen Speicherverwaltung. Ein C Programmierer weiß was er
> tut, braucht den ganzen Overhead nicht. Aber wenn er in C ein Android
> Programm schreibt, bauen ihm Zwischencode und ART den ganzen Overhead
> der idiotensicheren Java Runtime ein.

Und wieviele solcher C-Programmierer gibt es? Die kann man auf der 
ganzen Welt wohl an einer Hand abzählen...

Es ist nunmal Fakt, dass auch sehr gute Informatiker massive Probleme 
damit haben, robusten Code in C zu schreiben. Bestes Beispiel ist 
OpenSSL: Eine C-Bibliothek, die hauptsächlich von Kryptographen 
entwickelt wird. Alles sehr fähige (und intelligente) Leute. Trotzdem 
gibt es massig Bugs, die sich eben darauf zurückführen lassen, dass C 
verwendet wurde.

: Bearbeitet durch User
von Dussel (Gast)


Lesenswert?

Heinz K. schrieb:
> Verschiedene Programmiersprachen/Laufzeitumgebungen haben verschiedene
> Einsatzzwecke. Und man muss eben oftmals einen Trade-Off verschiedener
> Eigenschaften eingehen, um das optimale Ergebnis zu erzielen.
Ich weiß. Mit Assembler programmiert man keine Spiele und mit Java keine 
8-Bitter.
Hier geht es aber gerade darum, dass Java auf einem sehr begrenzten 
System eingesetzt wird.

Nach anfänglicher Ablehnung mag ich Java inzwischen ziemlich gerne. 
Kleine Programme, im Sinn von Funktionsumfang, kann man damit sehr viel 
schneller schreiben als mit C++. Aber wenn es um ein System mit 
eingeschränkten Ressourcen geht, sollte man eben nicht eine der Sprachen 
mit den höchsten Ressourcenanforderungen nehmen.

Wenn man Java wirklich compilieren könnte, wäre es für mich 
wahrscheinlich die beste Sprache. Meinen Informationen zufolge wird aber 
bei Compilieren die ganze VM mitcompiliert und in die Datei gepackt, 
wodurch das ganze wieder übermäßig groß wird.

von Dussel (Gast)


Lesenswert?

Nach den Klausuren fange ich mal an, die perfekte Sprache zu entwickeln.
http://www.xkcd.com/927/

von (prx) A. K. (prx)


Lesenswert?

Wofür wird Java heute recht oft eingesetzt? Für Anwendungen auf 
Webservern. Es gibt zwar tausend Sprachen, in denen man sie 
implementieren kann. Aber wenn man sich mal im realen Leben umsieht, 
dann sind die meisten in PHP oder Java. Da kann man über Java noch so 
meckern - bei dieser Alternative kann es nur gewinnen.

Apropos 512GB: Java braucht zwar etwas RAM, aber so wild ist das nicht. 
Nicht heute. Störender ist die Startzeit. Da mag eine grössere Anwendung 
ihre 16GB voraussetzen - aber es kann locker 10 Minuten dauern, bis das 
Sammelsurium an Dockern hochgefahren ist.

: Bearbeitet durch User
von Borislav B. (boris_b)


Lesenswert?

Heinz K. schrieb:
> Niemand wird Java (bzw.
> das Ökosystem Java) für ein embedded system einsetzen.

Java läuft sogar auf Kreditkarten :-)
https://de.wikipedia.org/wiki/Java_Card

von c-hater (Gast)


Lesenswert?

Heinz K. schrieb:

> Java wird ja hauptsächlich im Enterprisebereich eingesetzt.

Ja, weil irgendwann man ein Schlipsi mit blütenweißem Hemd dem wichtigen 
Einkäufer mit ebenfalls Schlips und blütenweißem Hemd versprochen hat, 
das Java alles richten wird. Und der Einkäufer seinem Cheffe das auch so 
weiter berichtet hat.

Sprich: eine Horde hochbezahlter technischer Vollidioten hat für die 
Verbreitung von Java gesorgt.

Das ist natürlich stark vereinfacht dargestellt, aber im Kern durchaus 
passend. Die aktuelle Situation zeigt das nur zu deutlich...

> Viel wichtiger ist bei solchen Enterpriseapplikationen dagegen, dass
> auch bei fluktuierenden Entwicklern der Code les- und damit wartbar
> bleibt.

Ja genau das ist der Punkt: Wir (hochbezahlte Schlipsies) wollen weg von 
den ekelhaft teuren kompetenten Programmierern. Die versauen doch nur 
die Bilanzen. Wir brauchen eine Sprache, in der sich sogar der Penner 
aus der nächsten Seitengasse hinter den drei Mülltonnen noch irgendwie 
ausdrücken kann, denn den können wir für ein paar Peanuts kaufen. So war 
der Plan der gierigen Schlipsies. Fazit heute: er ist einfach nicht 
aufgegangen...

> Es ist nunmal Fakt, dass auch sehr gute Informatiker massive Probleme
> damit haben, robusten Code in C zu schreiben.

Wohl wahr. C ist Dreck allerunterster Kajüte, unsicherer noch als pure 
Assembler. Allerdings: Java lehnt sich syntaxmäßig deutlich an C an. 
Zumindest die durch die selbstverschlüsselnde Syntax aufgeworfenen 
kognitiven Probleme hat Java also (ohne jede Not) bei C quasi 
eingekauft.

Deswegen liebe ich .net. Na klar, auch Microsoft konnte sich nicht 
gänzlich dem C/C++-Mummenschanz entziehen und deshalb gibt es C#. Aber 
das ist im Vergleich zu den syntaktischen Stammvätern doch schon eine 
sehr stringente Sprache. Etwa vergleichbar mit Java. Nur kann .Net mehr: 
es gehen auch richtige Sprachen mit verständlicher Syntax damit. Und man 
kann nahezu problemlos zwischen all diesen Sprachen hin- und 
herwechseln.

Wenigstens das muss aus so einem Ansatz mit Zwischencode effektiv 
herauskommen, sonst ist er unsinnig. Microsoft wins. Und das nicht nur 
meiner persönlichen Einschätzung nach, sondern auch im RL. Java stirbt.

von Vn N. (wefwef_s)


Lesenswert?

c-hater schrieb:
> Zumindest die durch die selbstverschlüsselnde Syntax aufgeworfenen
> kognitiven Probleme hat Java also (ohne jede Not) bei C quasi
> eingekauft.

Liegt möglicherweise auch an deiner mangelnden Auffassungsgabe.

von Hannäs (Gast)


Lesenswert?

c-hater schrieb:
> C ist Dreck allerunterster Kajüte, unsicherer noch als pure Assembler

Dümmliche Aussage


So dümmlich wie jeder Programmiersprachenstreit.

Programmieren erfordert logische Intelligenz. Sehr gute Programmierer 
haben sehr viel davon. So viel, daß sie den Programmiersprachenstreit 
lange als absurd erkannt haben und den Dümmeren überlassen.

von Hannäs (Gast)


Lesenswert?

Und nun zum Thema: Java braucht bei Android apk den geringsten Anteil. 
Tatsächlich blähen die Bitmaps ein apk extrem auf, u.a. weil nur png 
erlaubt ist.

Dann wird bei der Installation das apk erhalten und ausgepackt. Der 
Speicherbedarf verdreifacht sich grob.

Alles kein Problem bei apks unter sagen wir 5MB. Aber eine App unter 1MB 
mit mehr als einer Handvoll größerer Icons (>128*128*4bytes) ist sehr 
schwierig zu erreichen, übrigens auf fast jedem System.

von (prx) A. K. (prx)


Lesenswert?

Boris P. schrieb:
> Java läuft sogar auf Kreditkarten :-)

Ja, aber eben auf Kredit. Irgendwann musst du den ganzen gepumpten 
Speicher nachlegen.

von (prx) A. K. (prx)


Lesenswert?

Hannäs schrieb:
> Und nun zum Thema: Java braucht bei Android apk den geringsten Anteil.
> Tatsächlich blähen die Bitmaps ein apk extrem auf, u.a. weil nur png
> erlaubt ist.

Eben. Beitrag "Re: Warum brauchen Android Apps so viel Speicher"

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.