Samaan aikaan kuitenkin Android-huippumallit ovat pikkuhiljaa nostaneet RAM-muistin määrän vuoden takaisesta kahdesta gigatavusta kolmeen gigatavuun. Kysymys kuuluukin: Miksi Android vaatii kolme kertaa enemmän muistia toimiakseen sulavasti?
Vastaus tähän löytyy Quorassa julkaistusta varsin perusteellisesta vastauksesta: Android käyttää Javaa ja Javassa on mekanismi, jota kutsutaan garbage collectoriksi. Kyseinen mekanismi kierrättää käyttömuistia, joka vapautuu suljetulta sovellukselta. Ongelmaksi muodostuu se, että jos suljettu sovellus pyöriessään vaati vaikkapa 200 megatavua muistia, Javan garbage collector vaatii 3-4x tuon määrän muistia "kierrätysprosessinsa" aikana toimiakseen mahdollisimman sujuvasti. Eli vaikka käytetty ohjelma tarvisti vain 200 megatavua muistia, sen sulkeminen vaatii 600-800 megatavua muistia, jos muistin kierrätyksen halutaan tapahtuvan mahdollisimman nopeasti. Jos tuota vaadittua muistitilaa ei ole saatavilla, gargabe collectorin toiminta hidastuu merkittävästi, joka taas "tahmauttaa" koko järjestelmää kunnes muisti saadaan kierrätettyä.
ohessa tilannetta havainnollistava kaavio, lähde: Quora
iOS:ssa muistin vapautus toteutetaan eri tavalla, jolloin muistia ei vaadita kuin sen verran mitä varsinaiset käynnissä olevat ohjelmat vaativat.
Kommentit (19)
Java... Miten tuo takavuosien kirosana kummittelee vieläkin.
Ei Android tarvitse noin paljon keskusmuistia. Puhelinten valmistajat laittavat noin paljon keskusmuistia houkutellakseen asiakkaita. Tosiasiassa jo 1 Gt keskusmuistia riittää peruskäyttöön.
Peruskäyttöön, toki, mutta tuo tilastodata osoittaa kuitenkin selkeästi sen, että käytettyjen appsien vaatima muistimäärä x 4 pitäisi olla laitteessa, jotta se toimisi niin nopeasti kuin se vain voi.
Käytännössä kaikki Android-sovellukset koodataan Javalla, Googlen tarjoamat Androidin SDK:t ovat saatavilla vain Javalle.
Java käytetään vielä erittäin paljon. Tuon garbage collectorin etu on siinä, ettei ohjelmoijan tarvitse huolehtia milloin varataan ja vapautetaan muistia, vaan garbage collector huolehtii siitä. Eli javassa ohjelmoijan ei tarvitse päästä käsiksi niin tarkasti muistiin, jolloin ohjelmointi on paljon helpompaa, tulee vähemmän virheitä ja vähemmän tietoturva-aukkoja. Ilmeisesti kuitenki androidissa on mahdollista kirjoittaa natiiveja kirjastoja, joissa on mahdollista käyttää manuaalista muistinhallintaa.
Juu, Android NDK:n kautta noiden tekeminen on mahdollista, mutta hyvin, hyvin harvinaista.
Käytännössä kolmenlaisia sovelluksia:
-Javalla kirjoitetut sovellukset (näppituntumalta noin 90..94%)
-Apache Cordovalla (entinen PhoneGap) tai vastaavalla työkalulla webbisivuista tehdyt sovellukset (esim. Androidin Ampparit on tällainen), näitä on tämän uutisen mukaan kaikista Android-sovelluksista 5.4%
-NDK:lla tehdyt sovellukset
Puhelimissa tuota muistia eivät sovelluksista oikeasti tarvitse kuin pelit ja selaimet. Molemmat kategoriat ovat Androidilla pitkälti NDK-kamaa, koska sen avulla on mahdollista saavuttaa parempi suorituskyky ja siirrettävyys on parempi eri alustojen välillä (C/C++ -koodilla).
Ja roskienkeruuta on mahdollista käyttää myös iOS:llä vaikka käyttöjärjestelmä ei sitä oletuksena kehittäjille tarjoakaan
http://www.harnixtechnologies.ca/iGC/
IMHO syy miksi iPhoneja myydään pienellä muistimäärällä on se, että Apple haluaa pitää tuotteiden katteet korkeina. Esim. jos ajaa mitään isompia pelejä 512 megatavun muistilla varustetussa iOS-laitteessa niin Xcode kyllä suoltaa ulos memory pressure -valitusta ja laite sulkee taustalla olevien sovellusten varaamia muistialueita pois käytöstä.
Tai jos on selaimessa useampi välilehti auki niin iOS kyllä poistelee ne sieltä, kun jokin muu asia tarvitsee sitä muistia, joka hidastaa monen välilehden surffaamista, kuten Anandtech tuossa iPhone 6 -arvostelussa jo totesi
While iOS' software architecture is more RAM efficient due to manual garbage collection and the use of precompiled binaries, it's quite easy for me to push the phone past the breaking point in Safari. For example, six tabs of common websites for mobile devices cannot consistently be held in memory. If I continuously go through all six tabs, at least one will need to reload. In my first attempt at running this test, Safari crashed as I tried to go through all tabs constantly to keep them in memory. I didn't notice this behavior in the new Moto X, which can do the same test without issue.
http://www.anandtech.com/show/8554/the-iphone-6-review/12
Nyt on tehty vääriä johtopäätöksiä, eikä linkattu kuvaajakaan liity otsikkoon. Lyhyesti: Java-ohjelma _ei_ vaadi 3x muistia verrattuna natiivikoodiin. Garbage collection ei myöskään "kasvata ohjelman varaamaa muistia ohjelmaa sulkiessa", kuten tuossa jotenkin kummasti väitetään.
Kuvaajassa on verrattu erilaisia garbage-collection algoritmeja. Koska ohjelmoija itse ei vapauta varattuja olioita, vaan järjestelmä hoitaa sen sopivaksi katsomanaan ajankohtana. Tätä ei kannata tehdä liian usein, koska muuten teho menee turhaan tarkastamiseen. Liian harva tarkastus johtaa jo turhaksi käyneiden olioiden jäädessä muistiin pitemmäksi aikaa kun on tarpeen (tästä tulee tilapäinen RAM-tarpeen lisäys). Suurin osa ohjelmien varaamista olioista on pieniä, joten tarve vaikkapa nelinkertaiselle vapaalle heapille koko on myöskin pientä. Isoja muistilohkoja taas harvoin vapautetaan ja varataan jatkuvasti. Ja mikäli varataan, niin niille yleensä kirjoitetaan oma pool uudelleenkäyttöä varten. Tektissä mainittu tilanne 200MB vs 800MB on absurdi.
Trabant tarvitsee vain 16heppaa ja 2t
Trabant tarvitsee vain 16heppaa ja 2t
Artikkelissa väitetään että ohjelmat pyörivät. Ei minulla ole koskaan pyörinyt.
No joo, itselläni on vielä toistaiseksi käytössä Samsung Galaxy S3, gigatavu RAM-muistia, Cyanogenmod CM11 pyörii siinä vallan mainiosti, kaikki ylimääräinen "bloatware" poissa. Ei ole kertaakaan käytössä tullut vastaan mitään muistin loppumiseen liittyviä erroreita. Peruskäyttö minulla: musiikin kuuntelu, uutissyötteiden lukeminen, sähköpostin käyttö (Outlook.com app), web-selailu..
Hyviä faktoja. Android ei ole koko elinkaarensa aikana käyttänyt Javaa tai JVM:ää. Alustana on aina toiminut Dalvik, jossa on toki vastaava GC-mekanismi.
GC-mekanimia käytetään juuri siksi, että 3GB RAM maksaa vähemmän kuin innostaa sovelluskehittäjät vahtimaan heapin kokoa.
Tässä 1GB ja 3GB vertaus on vähän sama kuin vertaisi auton istumapaikkojen määrää, mutta sivuutetaan matkustaja määrät.
Oma mielipide Anroidin suuren muistin tarpeeseen on widgetit ottamatta sen suuremmin kantaa miten ne on tehty.
Jos siis Anroidi käytetään iPohnen tyyliin pelkkiä pikakuvakkeita käyttäen (ei widgettejä) niin puhelin ei lagaa yhtään. Itsellä jokunen wigetti käytössä. Sähköposti ja kalenteri näistä pahimpia niin, kun näytön avaa niin pientä tahmausta usein havaittavissa.
Tämä siis johtuu omien tutkimusten perusteella, että nuo widgetit lataavat aina sisällön uusiksi. Sen kyllä näkeekin, kun nuo lataavat sisällön ja siitä aina pieni tahmaus (tunnetaan myös lagina).
Iphonella ja win luureillahan tätä ongelmaa ei ole, koska eivät käytä noita widgettejä mitä anroidilla käytössä.
Tämä siis yhden miehen kenttätutkimus joten pidätän oikeuden mielipiteen muutokseen. :)
PS. LG G3 3Gigan muistilla
Omassa androidissa on vain 1gb muistia ja sulavasti toimii eikä ole kertaakaan loppunut kesken, moniajokin toimii hyvin. Edellisessä androidissa oli vain 512mb ja sekin riitti, mutta useinmiten moniajo ei, mutta sekin riippui itse ohjelmasta kuin muistin määrästä.
Toki eri asia on jos omistaa jonkun samsungin joka on täynnä bloatwarea :).
"GC is a huge performance problem for developing smooth android applications. At Facebook, one of the biggest performance problems we deal with is GCs pausing the UI thread. When dealing with lots of Bitmap data, GCs are frequent and hard to avoid. A single GC often results in dropped frames. Even if a GC only blocks the UI thread for a few milliseconds, it can significantly eat into the 16ms budget for rendering a frame."
Enemmän ihmetyttää miksi kirjoitatte että Applen laitteelle riittää giga muistia?
Mulla on iPad Air ja siinä on siis vain giga muistia. Safari crashaa usein koska muisti loppuu kesken. Ei tarvita kuin muutama tabi auki selaimeen, niin saattaa kaatua. Kokeilkaa vaikka avata Twitter ja selaatte twiitejä lisää muutaman kerran, niin se crashaa. Samoin sen huomaa siitä, että kun on useampi tabi auki, ja vaihdat tabia, niin selain lataa sivun aina uudestaan, kun muisti ei riitä pitää niitä taustalla auki. Samoin se crashaa kun menee esim pakkotoiston foorumille ja koettaa lukea threadejä, joissa on upotettuna videoita.
Kaiken lisäksi, Apple julkaisi uuden iPad Air 2:n, jossa on edelleenkin rupiset giga muistia.. Applen katteilla luulisi olevan varaa laittaa 2 gigaa muistia, jos asiakkaiden käyttökokemus kiinnostaisi enemmän kuin raha. Varsinkin kun Apple ja sen tukijat puhuu HYVÄN kokemuksen tärkeydestä.
Jos ette usko, niin kokeilkaa tai Googlatkaa "ipad safari crash out of memory" tai vastaavaa.
Erilaisesta muistinhallinnasta johtuen, samalla muistista saa eri määrän hyvää irti.
Ei ero kieltämättä ole niin suuri kuin mitä otsikko väittää, mutta eri on ja Applen käyttämällä ARC:lla on tiettyjä ihan mitattavia etuja GC:ta vastaan. 1. Nopeus 2. Pienempi muistinkäyttö 3. Ennustettavuus.
Ja vaikka Applen laitteissa on vähemmän muistia, käytännössä prosessi saa tarvittaessa käyttöönsä sitä paljon enemmän kuin Androidissa. Androidvalmistajilla on aivan käsittämättömän pieniä limittejä prosesseille sallitusta muistinkäytöstä.
http://stackoverflow.com/questions/1867...-an-app-can-use
Minulla on iPad 3 ja giga muistia. Safari ei crashaa juuri koskaan. Taustalla olevat tabit voivat tyhjentyä muistipaineessa, joka on kieltämättä joskus vähän ikävää.
Kokeilen kunhan olen kotosalla, mutta ei kai nyt *kukaan* käytä Twitteriä selaimella?! Natiivit appit on keksitty ja ihan syystä.
iPad Air 2:ssa on kaksi gigaa muistia... Virheelliseen premissiin perustuva ranttaus poistettu.