每個人都希望他們的應(yīng)用程序非常流暢。你已經(jīng)工作了幾年了,你有很多經(jīng)驗,但是為什么你的應(yīng)用程序仍然卡住而且很慢?
Android手機的開發(fā)語言是Java(kotlin也是Java的包裝),Java本身有一個非常好的內(nèi)存管理機制,稱為GC。然而,GC經(jīng)常遇到無法回收的內(nèi)存,例如,內(nèi)存泄漏、內(nèi)存抖動,結(jié)果可能是一個OOM。
JAVA編程可以跨平臺,但運行效率相對于iOS的Objective-C編程要低,運行時需要占用大量內(nèi)存來換取執(zhí)行速度,再加上不定期的內(nèi)存自動回收機制,出現(xiàn)的現(xiàn)象就是卡頓。隨著安裝程序越多,程序運行時,大量的系統(tǒng)垃圾和后臺運行占據(jù)了很多資源,如果你沒做好性能優(yōu)化,你的app就會又卡又慢,甚至直接黑屏死機,嚴重影響手機的正常使用體驗。
為了避免這些問題,我們必須熟悉JVM。
為什么有人說JVM是每個Android開發(fā)者都應(yīng)該掌握的技能?
如果要進行性能優(yōu)化,虛擬機對象分配、垃圾收集、線程調(diào)度、磁盤管理都與設(shè)備的性能有關(guān)。
從知識系統(tǒng)的角度來看,了解虛擬機可以加深你對語言的理解,這對系統(tǒng)調(diào)優(yōu)很有幫助,會讓你寫出高效低成本的代碼。
從實踐發(fā)展角度,在Android開發(fā)上,各大熱修復(fù)技術(shù)方案,熱更新等很多問題時候都離不開你對虛擬機管理機制的研究,因為我們很多工作時候你需要hook某些虛擬機的實現(xiàn),如果不了解學(xué)生怎么成為可能可以做得到,例如通過阿里的sophix。
Jvm將運行時數(shù)據(jù)劃分為線程私有和共享數(shù)據(jù)區(qū)域。線程專用數(shù)據(jù)區(qū)域包含程序計數(shù)器、虛擬機堆棧和局部方法區(qū)域。所有線程共享的數(shù)據(jù)區(qū)域包含java堆、方法區(qū)域,并且在方法區(qū)域中有一個常量池。內(nèi)存泄漏是指系統(tǒng)無法回收已分配但未使用的內(nèi)存。打個比方,就像你家的水龍頭沒開,水就漏了。
內(nèi)存泄漏分為:
頻繁的內(nèi)存泄漏,偶爾的內(nèi)存泄漏,一次內(nèi)存泄漏,隱式內(nèi)存泄漏。
隱式內(nèi)存泄漏問題非常重要有害,因為沒有它們比常規(guī)的、偶爾的內(nèi)存泄漏更難進行檢測。內(nèi)存泄漏的累積將消耗管理系統(tǒng)中的所有這些內(nèi)存!
APP性能優(yōu)化是android開發(fā)者應(yīng)該具備的一項綜合素質(zhì),也是開發(fā)者能夠完成高質(zhì)量應(yīng)用作品的保證。
關(guān)于JVM的核心原則,你知道些什么?我們?nèi)绾问褂肑VM原則來指導(dǎo)代碼實踐?我們?nèi)绾卧诩軜?gòu)層次上優(yōu)化產(chǎn)品性能?谷歌工程師如何實施性能和功能改進技術(shù)?在項目的總體框架設(shè)計中應(yīng)該使用哪些優(yōu)化技術(shù)?