Android虛擬機(jī)內(nèi)存怎么分配
愛學(xué)習(xí)的小伙伴們,可能都知道Android虛擬機(jī),但是你知道Android虛擬機(jī)內(nèi)存怎么分配嗎?
安卓虛擬機(jī)
這款軟件是google官方出品,以方便開發(fā)者使用安卓環(huán)境,方便開發(fā)??梢宰屇阍赑C端(電腦上)安裝運(yùn)行模擬Android系統(tǒng)。并可以在電腦端進(jìn)行幾乎任何手機(jī)上可以進(jìn)行的操作,甚至還可以像手機(jī)一樣連接電腦,被手機(jī)助手檢測(cè)到,可以模擬所有官方版本的安卓系統(tǒng),并且有多款皮膚和屏幕樣式可供選擇。但由于windows電腦需要跨平臺(tái),所以模擬出來的效果和虛擬機(jī)性能可沒有arm機(jī)器跑起來的好。
使用方法
準(zhǔn)備工作:在體驗(yàn)前我們首先要下載Java的JDK(全稱Java SE Development Kit)以及Android的SDK。下載Java JDK或者Java JRE(建議選擇JDK,JDK比JRE多出開發(fā)功能,可以用來編譯java程序)[1] 下載Android SDK[2] 安裝JDK和SDK:安裝Java JDK或JRE(一般安裝在默認(rèn)路徑,若改變路徑請(qǐng)對(duì)應(yīng)修改下面環(huán)境變量的值)安裝Android SDK,免裝版建議放到一個(gè)記得住的地方,建議不要有中文路徑打開安裝好后打開所安裝的目錄(默認(rèn)C:\Program Files\Android\android-sdk)打開SDK Manager.exe 加載過程中程序會(huì)連接Google服務(wù)器更新Android各版本資源,下載非常慢,建議。在需要安裝的版本前面打勾,下載時(shí)間很漫長(zhǎng),除了安卓必要的組件之外(必要組件會(huì)提示),勾選一個(gè)系統(tǒng),如api 15Android 4.0(我們?cè)谶@里就只示范一下安裝Android 4.0的了),各版本安裝過程大同小異,機(jī)友如有興趣可以繼續(xù)嘗試其他版本。點(diǎn)擊Install packages。選擇Accept All,然后點(diǎn)擊Install修改環(huán)境變量:完成下載后,我們首選需要對(duì)電腦進(jìn)行java的環(huán)境變量的設(shè)置右鍵點(diǎn)擊我的電腦-屬性高級(jí)-環(huán)境變量(WindowsXP) 高級(jí)系統(tǒng)設(shè)置-高級(jí)-環(huán)境變量(Windowns7)點(diǎn)擊新建.。.添加下面這兩個(gè)變量變量名:JAVA_HOME變量值:C:\Program Files\Java\jdk1.6.0_10 如果安裝路徑不同,按自己的安裝情況寫變量名:classpath變量值:.;%JAVA_HOME%\lib;(注意符號(hào),前面是英文的句號(hào)和分號(hào),最后有個(gè)分號(hào),這行的java_home就相當(dāng)于引用上邊的路徑,所以也可以直接寫上面文件夾中的lib文件夾的路徑)還有一個(gè)環(huán)境變量Path,系統(tǒng)默認(rèn)已經(jīng)出現(xiàn),在系統(tǒng)變量下找到這個(gè)變量,點(diǎn)擊編輯。在已經(jīng)有的變量值前面,加入下面這個(gè)變量C:\Program Files\Java\jdk1.6.0_10\bin; (或自己安裝的路徑,注意包括“;”即在每一個(gè)路徑中間加上分號(hào))安裝完成,可以使用了
Android虛擬機(jī)虛擬機(jī)內(nèi)存怎么分配
大家都知道Android的上層應(yīng)用是基于 Dalvik Virtual Machine的。Dalvik VM的特點(diǎn)是基于寄存器,相比SUN的JVM(基于堆棧,沒有寄存器)來說,理論上完成同樣的功能需要的指令條數(shù)少,但是指令集復(fù)雜。到了Android2.2,Dalvik終于實(shí)現(xiàn)了JIT(Just In Time)功能,前進(jìn)了一大步。
近期我們遇到OutOfMemory的錯(cuò)誤,通常是堆內(nèi)存溢出。網(wǎng)上有些帖子說可以通過函數(shù)設(shè)置應(yīng)用的HEAP SIZE來解決這個(gè)問題,其實(shí)是不對(duì)的。
VMRuntime.getRuntime().setMinimumHeapSize(NewSize);
堆(HEAP)是VM中占用內(nèi)存最多的部分,通常是動(dòng)態(tài)分配的。堆的大小不是一成不變的,通常有一個(gè)分配機(jī)制來控制它的大小。比如初始的HEAP是4M大,當(dāng)4M的空間被占用超過75%的時(shí)候,重新分配堆為8M大;當(dāng)8M被占用超過75%,分配堆為16M大。倒過來,當(dāng)16M的堆利用不足30%的時(shí)候,縮減它的大小為8M大。重新設(shè)置堆的大小,尤其是壓縮,一般會(huì)涉及到內(nèi)存的拷貝,所以變更堆的大小對(duì)效率有不良影響。
上面只是個(gè)例子,不過可以看到三個(gè)參數(shù):max heap size, min heap size, heap utilization(堆利用率)。
Max Heap Size,是堆內(nèi)存的上限值,Android的缺省值是16M(某些機(jī)型是24M),對(duì)于普通應(yīng)用這是不能改的。函數(shù)setMinimumHeapSize其實(shí)只是改變了堆的下限值,它可以防止過于頻繁的堆內(nèi)存分配,當(dāng)設(shè)置最小堆內(nèi)存大小超過上限值時(shí)仍然采用堆的上限值(16M),對(duì)于內(nèi)存不足沒什么作用。
setTargetHeapUtilization(float newTarget) 可以設(shè)定內(nèi)存利用率的百分比,當(dāng)實(shí)際的利用率偏離這個(gè)百分比的時(shí)候,虛擬機(jī)會(huì)在GC的時(shí)候調(diào)整堆內(nèi)存大小,讓實(shí)際占用率向個(gè)百分比靠攏。
//程序onCreate時(shí)調(diào)用
private final static floatTARGET_HEAP_UTILIZATION = 0.75f;
VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);
總結(jié):
手機(jī)應(yīng)用開發(fā)資源是很有限的,堆內(nèi)存的上限值只有16M。不過只要代碼寫的好,這個(gè)值對(duì)于目前的手機(jī)應(yīng)用需求已經(jīng)足夠了。
如果出現(xiàn)內(nèi)存溢出問題,把精力放在代碼優(yōu)化上吧。
java虛擬機(jī)的內(nèi)存設(shè)置詳解Android虛擬機(jī)內(nèi)存怎么分配相關(guān)文章: