1. 程式人生 > >關於修改虛擬機器記憶體,和開啟“硬體加速

關於修改虛擬機器記憶體,和開啟“硬體加速

昨晚回覆了一個帖子,內容比較經典,所以特開一貼,大家可以研究一下!

主要是機子裡的關於系統性能的2個引數:



1.  debug.sf.hw=0,修改為debug.sf.hw=1,此步驟為開啟硬體加速


2.  dalvik.vm.heapsize=24m,修改為dalvik.vm.heapsize=32m,此步驟為修改虛擬機器大小為32m


上面的第二點注意,這是修改 虛擬機器記憶體,不是修改虛擬記憶體!!  這2者完全不同!





最近

論壇

裡關於修改安卓系統2個引數的帖子很火,說修改後可以提升

手機

的效能。修改後有說好用的,也有說不好用的,好用的把樓主捧為了神,不好用的把樓主罵個半死,其實科學嘛,總有好處有壞處的,我們只要好好分析,就能得知我們為什麼要改,還有修改後可以得到什麼樣的益處。捧別人為神或者踩別人為泥都對事情發展沒有好處。



關於修改的內容,主要是修改2個引數:



debug.sf.hw=0,修改為debug.sf.hw=1,此步驟為開啟硬體加速


dalvik.vm.heapsize=24m,修改為dalvik.vm.heapsize=32m,此步驟為修改虛擬機器大小為32m




我來跟你解釋這2個引數有什麼作用,並且說說為什麼我做ROM的時候不修改這2個引數。



1. dalvik.vm.heapsize=24m,修改為dalvik.vm.heapsize=32m,此步驟為修改虛擬機器大小為32m



安卓系統 實際上,就是建立在 linux核心上的一個JAVA系統, 瞭解JAVA的同學應該知道, 在執行JAVA程式的時候,需要在每個程式上建立一個虛擬機器, 以獲得記憶體的分配,優點是假設某個程式崩潰了,系統只要關閉那個虛擬機器就可以了,不會影響其他程式,缺點是很耗記憶體,因為你每開一個程式,就要新開一個虛擬機器。


舉個例子,開啟程式A 的時候,程式A 就自動向系統申請1份虛擬機器記憶體, 然後不關閉,再開一個程式B ,程式B要求向系統申請 3份記憶體, 假設虛擬機器記憶體設定為24M ,那麼這2個程式合共佔用了記憶體 1X24 + 3X24 = 96M 。  假設虛擬機器記憶體設定為 32M ,則這2個程式合共佔用了記憶體 1X32 + 3X32 =128M



那麼,究竟修改好,還是不修改好呢?


假設你的機子裡,平常只執行一些小程式,例如QQ、看書

軟體

、小

遊戲

等,那麼建議你不要修改,就使用標準的24M,因為足夠用,並且防止執行程式過多,而產生崩潰。那是不是越小越好呢?當然不是,因為分配給程式的記憶體過小,有可能因為軟體申請不到足夠的記憶體,而執行不流暢。



假設平常經常執行大型程式,例如大型3D遊戲等,則可以稍微調大一些,以使大型程式得到足夠的記憶體來執行,可以更流暢。 那是不是越大越好呢,當然不是,因為調的太大,其他程式就分配不到記憶體,無法運行了。



google 為什麼要把系統的虛擬機器設定為24M 呢? 由於有些軟體吃記憶體,也有一些小軟體不吃記憶體,我覺得這是屬於一箇中庸的設計,由於沒法全部偏向大型,也沒法全部偏向小型,那就中庸吧。




我們都知道,華為C8650的機身記憶體 RAM 是256M ,這是固定的,給一個虛擬機器用24M 還是 32M ,自己決定吧,不過,對於某些程式控,在手機裡裝一大堆需要開啟服務的軟體的筒子們,建議還是別改了,否則開機的時候需要啟動一大堆程式,最後弄得機子都開不了。



我們來和常用的windows系統對比一下,假設同樣有256M記憶體



windows系統的記憶體機制是:來了一個程式,程式告訴系統,我要100M ,然後來了第二個程式,第二個程式說,我要150M, 這個時候,記憶體已經被使用100M + 150M = 250M,剩餘6M 。


然後來了第三個程式,第三個程式說,我要50M, 由於不夠分給他,系統就崩潰了。



安卓系統的記憶體機制是: 來了一個程式,程式告訴系統,我要100M ,然後來了第二個程式,第二個程式說,我要150M, 這個時候,記憶體已經被使用100M + 150M = 250M,剩餘6M 。


然後來了第三個程式,第三個程式說,我要50M, 這個時候系統自動關閉最先申請記憶體程式的虛擬機器,或者最次要程式的虛擬機器,他把第一個程式關閉了,系統獲得了100M的記憶體,加上剩餘的6M,合共106M,分配給第三個程式50M,系統繼續執行。



第一個是 三個和尚,最後大家都沒水吃


第二個是 犧牲小我,完成大我。



當然,系統在實際運用中,比上面複雜多了,例如安卓還加入了“隱藏機制”,只要不執行的程式,都自動馬上釋放記憶體, windows系統出現3個程式搶記憶體的情況,也加入了“等待機制”等,有興趣的話可以自己研究。


轉載一段 hiapk論壇的文章: 《安卓的原理...不用在意記憶體的大小》 (以下全部都是轉載)



不用在意剩餘記憶體的大小。        


其實很多人都是把使用其他系統的習慣帶過來來了。

android

大多應用沒有退出的設計其實是有道理的,這和系統對程序的排程機制有關係。如果你知道java,就能更清楚這機制了。其實和java的垃圾回收機制類似,系統有一個規則來回收記憶體。進行記憶體排程有個閥值,只有低於這個值系統才會按一個列表來關閉使用者不需要的東西。當然這個值預設設定得很小,所以你會看到記憶體老在很少的數值徘徊。但事實上他並不影響速度。相反加快了下次啟動應用的速度。這本來就是android標榜的優勢之一,如果人為去關閉程序,沒有太大必要。特別是自動關程序的軟體。


        到這裡有人會說了,那為什麼記憶體少的時候執行大型程式會慢呢?其實很簡單,在記憶體剩餘不多時開啟大型程式,會觸發系統自身的調程序排程策略,這是十分消耗系統資源的操作,特別是在一個程式頻繁向系統申請記憶體的時候。這種情況下系統並不會關閉所有開啟的程序,而是選擇性關閉,頻繁的排程自然會拖慢系統。所以,論壇上有個更改記憶體閥值的程式可以有一定改善。


        但改動也可能帶來一些問題,取決於值的設定。


        那麼,程序管理軟體有無必要呢?有的。就是在執行大型程式之前,你可以手動關閉一些程序釋放記憶體,可以顯著的提高執行速度。但一些小程式,完全可交由系統自己管理。談到這裡,可能有的

朋友

會問,如果不關程式是不是會更耗電。我就說說android後臺的原理,你就明白了。android的應用在被切換到後臺時,它其實已經被暫停了,並不會消耗cpu資源,只保留了執行狀態。所以為什麼有的程式切出去重進會到主介面。但是,一個程式如果想要在後臺處理些東西,如

音樂

播放,它就會開啟一個服務。服務可在後臺持續執行,所以在後臺耗電的也只有帶服務的應用了。這個在程序管理軟體裡能看到,標籤是service。至於廣播什麼的我就不涉及了。所以沒有帶服務的應用在後臺是完全不耗電的,沒有必要關閉。這種設計本來就是一個非常好的設計,下次啟動程式時,會更快,因為不需要讀取介面資源,何必要關掉他們抹殺這個android的優點呢?            還有一個。為什麼android一個應用看起來那麼耗記憶體。大家知道,android上的應用是java,當然需要虛擬機器,而android上的應用是帶有獨立虛擬機器的,也就是每開一個應用就會開啟一個獨立的虛擬機器。這樣設計的原因是可以避免虛擬機器崩潰導致整個系統崩潰,但代價就是需要更多記憶體。


        以上這些設計確保了android的穩定性,正常情況下最多單個程式崩潰,但整個系統不會崩潰,也永遠沒有記憶體不足的提示出現。大家可能是被windows毒害得太深了,總想保留更多的記憶體,但實際上這並不一定會提升速度,相反卻喪失了程式啟動快的這一系統特色,很沒必要。大家不妨按我說的習慣來用用這個系統。最後推薦一款程序管理軟體,systempanel,market上能搜到,介面友好啟動快,功能也不錯,用於手動關閉程序很好的軟體。


        祝大家玩機愉快,這系統開十天半個月都沒問題,不是windows。


原帖地址:


以上內容均為轉帖過來,至於為什麼開了大程式或者開了好幾個程式之後切換會變慢,我的理解如下


1.大程式A已經開啟,佔用70%記憶體,如果再想執行一個B,需要50%的記憶體,則就需要一個將A從記憶體中釋放或者壓縮的過程,所以表現出來的就是慢一會兒


2.A\B\C\D\E共佔用記憶體80%,執行新程式Z需要20%的記憶體,系統記憶體因為沒見過剩餘0的時候,也就是應該剩一部分空閒記憶體,那麼就需要從A~E這幾個程式中選擇一個或者幾個來關閉,這一過程也需要耗費系統資源,所以會慢一會兒


3.也就是說你手動去殺程式的時候,就是替系統在釋放記憶體,就算你不殺,在需要記憶體的時候系統也會自動釋放。


4.不在後臺執行的程式(沒服務的),即使不殺也不會耗電。在後臺執行的(有服務的)程式,如後臺放歌,當然會耗電。


5.不是說殺程序沒用,不然作者就不會推薦程序管理軟體了。哪個帶服務耗電哪個後臺一直在執行,看服務就能看出來,這樣的該殺。


6,以qq舉例,正常的退,會在程序管理裡留下qq的執行狀態,但不耗電不佔cpu,如果你只是切換出去(按小房子而不是退出)那麼自然會耗電,因為程式還在執行。




第二個引數: debug.sf.hw=0,修改為debug.sf.hw=1,此步驟為開啟硬體加速



首先,我要說明,這個世界上沒有免費的午餐,假設通過那麼簡單的設定就可以提升效能,那廠商為什麼不做呢?由此可知這個玩意實在效用有限,或者是需要和其他工具配合使用!



這個設定的作用到現在為止還沒有一個標準的說法來說明這是用來幹嘛的, 開啟硬體加速? 開啟什麼硬體加速?



難道是3D效能? 難道不開啟就沒有3D效能嗎?


開啟CPU某些特殊效能? 這個也不靠譜啊!獲取CPU效能關鍵看指令集!而且,為什麼不一開始就使用呢?


開啟其他硬體效能? 改了難道音箱變大聲了? 改了難道30W畫素的攝像頭可以照500W了?改了難道記憶體由256M變成512M 了?


要麼就是讓CPU 一直保持100%效能的狀態?那樣效能是提升了,但是電池效果卻下降了! (覺得這個解釋還稍微靠譜一些)




我個人認為,這個設定的作用,目的是開啟或者結束硬體廠商的優化指令,因為每個廠商對硬體的設定不一樣,肯定在某些位置設定了一個優化指令,並且通過這個設定來開啟。



例如,google 的工程設計標準裡,設計了某個版本的手機設定標準是256M記憶體,並且告訴所有手機生產廠商:如果你是按照我的標準來製作,那麼 debug.sf.hw= 就設定為0, 如果你要自己更改部分硬體設定,那麼就設定為1 ,但是設定為 1 後,你得指向一個檔案,告訴系統究竟修改了一些什麼了。  某手機廠商為了手機速度更快,增加記憶體到512M,並且設定了一個檔案,告訴系統,這個手機是用512M記憶體的,不是256M。



然後某個人開始使用帶有優化指令的手機, 過了一段

時間

,又換了新手機後,發現配置接近,但是效能卻不一樣, 於是對比原來手機的檔案,發現了這個指令,於是進行修改了,並且很有興致的告訴別人,但是實際上,他用的新手機並沒有設定優化指令啊,開啟了以後等於沒開啟,甚至由於系統找不到優化指令,但是設定又告訴他有優化指令,弄得系統也不知所措,執行更慢,或者出現問題........



但是,由於這個人的“新發現”,弄得這個簡單的 0和1 成為了一代傳說(或者是一代流言)



特別宣告: 紅字部分僅為個人猜測。



由於手頭資料有限,可能本人有錯漏,歡迎指正。



有人說,現在所有的自制ROM都改了這2個引數了,其實,至少我的ROM從來都不改的,有興趣可以用我的ROM研究一下。



ROM地址:

http://bbs.apkok.com/thread-141669-1-1.html