1. 程式人生 > >Android效能優化——如何避免OOM總結

Android效能優化——如何避免OOM總結

從四個方面著手,首先是減小物件的記憶體佔用,其次是記憶體物件的重複利用,然後是避免物件的記憶體洩露,最後是記憶體使用策略優化。

減小物件的記憶體佔用

避免OOM的第一步就是要儘量減少新分配出來的物件佔用記憶體的大小,儘量使用更加輕量的物件。

1)使用更加輕量的資料結構

1、考慮使用ArrayMap/SparseArray(SparseBoolMap,SparseIntMap,SparseLongMap,LongSparseMap)而不是HashMap等傳統資料結構
ArrayMap、SparseArray使用場景:

  • 物件個數的數量級最好是千以內
  • 資料組織形式包含Map結構

這裡寫圖片描述
關於更多ArrayMap/SparseArray的討論 :

ArrayMap原理前三節

2)避免在Android裡面使用Enum

3)減小Bitmap物件的記憶體佔用

Bitmap是一個極容易消耗記憶體的大胖子,減小創建出來的Bitmap的記憶體佔用是很重要的,通常來說有下面2個措施:

  • inSampleSize:縮放比例,在把圖片載入記憶體之前,我們需要先計算出一個合適的縮放比例,避免不必要的大圖載入。
  • decodeformat:解碼格式,選擇ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,存在很大差異

4)使用更小的圖片

在設計給到資源圖片的時候,我們需要特別留意這張圖片是否存在可以壓縮的空間,是否可以使用一張更小的圖片。儘量使用更小的圖片不僅僅可以減少記憶體的使用,還可以避免出現大量的InflationException。假設有一張很大的圖片被XML檔案直接引用,很有可能在初始化檢視的時候就會因為記憶體不足而發生InflationException,這個問題的根本原因其實是發生了OOM。

記憶體物件的重複利用

大多數物件的複用,最終實施的方案都是利用物件池技術,要麼是在編寫程式碼的時候顯式的在程式裡面去建立物件池,然後處理好複用的實現邏輯,要麼就是利用系統框架既有的某些複用特性達到減少物件的重複建立,從而減少記憶體的分配與回收。
這裡寫圖片描述

1)複用系統自帶的資源(系統資源個人很少用)

Android系統本身內建了很多的資源,例如字串/顏色/圖片/動畫/樣式以及簡單佈局等等,這些資源都可以在應用程式中直接引用。這樣做不僅僅可以減少應用程式的自身負重,減小APK的大小,另外還可以一定程度上減少記憶體的開銷,複用性更好。但是也有必要留意Android系統的版本差異性,對那些不同系統版本上表現存在很大差異,不符合需求的情況,還是需要應用程式自身內建進去。

2)注意在ListView/GridView等出現大量重複子元件的視圖裡面對ConvertView的複用(RecyclerView解決了這個問題)

這裡寫圖片描述

3)Bitmap物件的複用( 使用 Glide庫)

  • 在ListView與GridView等顯示大量圖片的控制元件裡面需要使用LRU的機制來快取處理好的Bitmap。

4)避免在onDraw方法裡面執行物件的建立

類似onDraw等頻繁呼叫的方法,一定需要注意避免在這裡做建立物件的操作,因為他會迅速增加記憶體的使用,而且很容易引起頻繁的gc,甚至是記憶體抖動。

5)StringBuilder

在有些時候,程式碼中會需要使用到大量的字串拼接的操作,這種時候有必要考慮使用StringBuilder來替代頻繁的“+”。

避免物件的記憶體洩露

記憶體物件的洩漏,會導致一些不再使用的物件無法及時釋放,這樣一方面佔用了寶貴的記憶體空間,很容易導致後續需要分配記憶體的時候,空閒空間不足而出現OOM。顯然,這還使得每級Generation的記憶體區域可用空間變小,gc就會更容易被觸發,容易出現記憶體抖動,從而引起效能問題。
LeakCanary:記憶體洩露 檢測控制元件。
這裡寫圖片描述

1)注意Activity的洩漏

通常來說,Activity的洩漏是記憶體洩漏裡面最嚴重的問題,它佔用的記憶體多,影響面廣,我們需要特別注意以下兩種情況導致的Activity洩漏:

  • 內部類引用導致Activity的洩漏

最典型的場景是Handler導致的Activity洩漏,如果Handler中有延遲的任務或者是等待執行的任務佇列過長,都有可能因為Handler繼續執行而導致Activity發生洩漏。此時的引用關係鏈是Looper -> MessageQueue -> Message -> Handler -> Activity。為了解決這個問題,可以在UI退出之前,執行remove Handler訊息佇列中的訊息與runnable物件。或者是使用Static + WeakReference的方式來達到斷開Handler與Activity之間存在引用關係的目的。

  • Activity Context被傳遞到其他例項中,這可能導致自身被引用而發生洩漏。

內部類引起的洩漏不僅僅會發生在Activity上,其他任何內部類出現的地方,都需要特別留意!我們可以考慮儘量使用static型別的內部類,同時使用WeakReference的機制來避免因為互相引用而出現的洩露。

2)考慮使用Application Context而不是Activity Context

對於大部分非必須使用Activity Context的情況(Dialog的Context就必須是Activity Context),我們都可以考慮使用Application Context而不是Activity的Context,這樣可以避免不經意的Activity洩露。

3)注意臨時Bitmap物件的及時回收(本人 使用 Glide第三方)

雖然在大多數情況下,我們會對Bitmap增加快取機制,但是在某些時候,部分Bitmap是需要及時回收的。例如臨時建立的某個相對比較大的bitmap物件,在經過變換得到新的bitmap物件之後,應該儘快回收原始的bitmap,這樣能夠更快釋放原始bitmap所佔用的空間。
需要特別留意的是Bitmap類裡面提供的createBitmap()方法:
這裡寫圖片描述
這個函式返回的bitmap有可能和source bitmap是同一個,在回收的時候,需要特別檢查source bitmap與return bitmap的引用是否相同,只有在不等的情況下,才能夠執行source bitmap的recycle方法。

4)注意監聽器的登出

在Android程式裡面存在很多需要register與unregister的監聽器,我們需要確保在合適的時候及時unregister那些監聽器。自己手動add的listener,需要記得及時remove這個listener。

5)注意快取容器中的物件洩漏

有時候,我們為了提高物件的複用性把某些物件放到快取容器中,可是如果這些物件沒有及時從容器中清除,也是有可能導致記憶體洩漏的。例如,針對2.3的系統,如果把drawable新增到快取容器,因為drawable與View的強應用,很容易導致activity發生洩漏。而從4.0開始,就不存在這個問題。解決這個問題,需要對2.3系統上的快取drawable做特殊封裝,處理引用解綁的問題,避免洩漏的情況。

6)注意WebView的洩漏

Android中的WebView存在很大的相容性問題,不僅僅是Android系統版本的不同對WebView產生很大的差異,另外不同的廠商出貨的ROM裡面WebView也存在著很大的差異。更嚴重的是標準的WebView存在記憶體洩露的問題,看這裡WebView causes memory leak - leaks the parent Activity。所以通常根治這個問題的辦法是為WebView開啟另外一個程序,通過AIDL與主程序進行通訊,WebView所在的程序可以根據業務的需要選擇合適的時機進行銷燬,從而達到記憶體的完整釋放。

7)注意Cursor物件是否及時關閉

在程式中我們經常會進行查詢資料庫的操作,但時常會存在不小心使用Cursor之後沒有及時關閉的情況。這些Cursor的洩露,反覆多次出現的話會對記憶體管理產生很大的負面影響,我們需要謹記對Cursor物件的及時關閉。

記憶體使用策略優化

1)謹慎使用large heap

正如前面提到的,Android裝置根據硬體與軟體的設定差異而存在不同大小的記憶體空間,他們為應用程式設定了不同大小的Heap限制閾值。你可以通過呼叫getMemoryClass()來獲取應用的可用Heap大小。在一些特殊的情景下,你可以通過在manifest的application標籤下新增largeHeap=true的屬性來為應用宣告一個更大的heap空間。然後,你可以通過getLargeMemoryClass()來獲取到這個更大的heap size閾值。然而,宣告得到更大Heap閾值的本意是為了一小部分會消耗大量RAM的應用(例如一個大圖片的編輯應用)。不要輕易的因為你需要使用更多的記憶體而去請求一個大的Heap Size。只有當你清楚的知道哪裡會使用大量的記憶體並且知道為什麼這些記憶體必須被保留時才去使用large heap。因此請謹慎使用large heap屬性。使用額外的記憶體空間會影響系統整體的使用者體驗,並且會使得每次gc的執行時間更長。在任務切換時,系統的效能會大打折扣。另外, large heap並不一定能夠獲取到更大的heap。在某些有嚴格限制的機器上,large heap的大小和通常的heap size是一樣的。因此即使你申請了large heap,你還是應該通過執行getMemoryClass()來檢查實際獲取到的heap大小。

2)綜合考慮裝置記憶體閾值與其他因素設計合適的快取大小

  • 應用程式剩下了多少可用的記憶體空間?
  • 有多少圖片會被一次呈現到螢幕上?有多少圖片需要事先快取好以便快速滑動時能夠立即顯示到螢幕?
  • 裝置的螢幕大小與密度是多少? 一個xhdpi的裝置會比hdpi需要一個更大的Cache來hold住同樣數量的圖片。
  • 不同的頁面針對Bitmap的設計的尺寸與配置是什麼,大概會花費多少記憶體?
  • 頁面圖片被訪問的頻率?是否存在其中的一部分比其他的圖片具有更高的訪問頻繁?如果是,也許你想要儲存那些最常訪問的到記憶體中,或者為不同組別的點陣圖(按訪問頻率分組)設定多個LruCache容器。

3)onLowMemory()與onTrimMemory()

Android使用者可以隨意在不同的應用之間進行快速切換。為了讓background的應用能夠迅速的切換到forground,每一個background的應用都會佔用一定的記憶體。Android系統會根據當前的系統的記憶體使用情況,決定回收部分background的應用記憶體。如果background的應用從暫停狀態直接被恢復到forground,能夠獲得較快的恢復體驗,如果background應用是從Kill的狀態進行恢復,相比之下就顯得稍微有點慢。
這裡寫圖片描述

  • onLowMemory():Android系統提供了一些回撥來通知當前應用的記憶體使用情況,通常來說,當所有的background應用都被kill掉的時候,forground應用會收到onLowMemory()的回撥。在這種情況下,需要儘快釋放當前應用的非必須的記憶體資源,從而確保系統能夠繼續穩定執行。
  • onTrimMemory(int):Android系統從4.0開始還提供了onTrimMemory()的回撥,當系統記憶體達到某些條件的時候,所有正在執行的應用都會收到這個回撥,同時在這個回撥裡面會傳遞以下的引數,代表不同的記憶體使用情況,收到onTrimMemory()回撥的時候,需要根據傳遞的引數型別進行判斷,合理的選擇釋放自身的一些記憶體佔用,一方面可以提高系統的整體執行流暢度,另外也可以避免自己被系統判斷為優先需要殺掉的應用。下圖介紹了各種不同的回撥引數:
  • TRIM_MEMORY_UI_HIDDEN:你的應用程式的所有UI介面被隱藏了,即使用者點選了Home鍵或者Back鍵退出應用,導致應用的UI介面完全不可見。這個時候應該釋放一些不可見的時候非必須的資源

當程式正在前臺執行的時候,可能會接收到從onTrimMemory()中返回的下面的值之一:

  • TRIM_MEMORY_RUNNING_MODERATE:你的應用正在執行並且不會被列為可殺死的。但是裝置此時正運行於低記憶體狀態下,系統開始觸發殺死LRU Cache中的Process的機制。
  • TRIM_MEMORY_RUNNING_LOW:你的應用正在執行且沒有被列為可殺死的。但是裝置正運行於更低記憶體的狀態下,你應該釋放不用的資源用來提升系統性能。
  • TRIM_MEMORY_RUNNING_CRITICAL:你的應用仍在執行,但是系統已經把LRU Cache中的大多數程序都已經殺死,因此你應該立即釋放所有非必須的資源。如果系統不能回收到足夠的RAM數量,系統將會清除所有的LRU快取中的程序,並且開始殺死那些之前被認為不應該殺死的程序,例如那個包含了一個執行態Service的程序。

當應用程序退到後臺正在被Cached的時候,可能會接收到從onTrimMemory()中返回的下面的值之一:

  • TRIM_MEMORY_BACKGROUND: 系統正運行於低記憶體狀態並且你的程序正處於LRU快取名單中最不容易殺掉的位置。儘管你的應用程序並不是處於被殺掉的高危險狀態,系統可能已經開始殺掉LRU快取中的其他程序了。你應該釋放那些容易恢復的資源,以便於你的程序可以保留下來,這樣當用戶回退到你的應用的時候才能夠迅速恢復。
  • TRIM_MEMORY_MODERATE:系統正運行於低記憶體狀態並且你的程序已經已經接近LRU名單的中部位置。如果系統開始變得更加記憶體緊張,你的程序是有可能被殺死的。
  • TRIM_MEMORY_COMPLETE: 系統正運行於低記憶體的狀態並且你的程序正處於LRU名單中最容易被殺掉的位置。你應該釋放任何不影響你的應用恢復狀態的資源。

    這裡寫圖片描述

  • 因為onTrimMemory()的回撥是在API 14才被加進來的,對於老的版本,你可以使用onLowMemory)回撥來進行相容。onLowMemory相當與TRIM_MEMORY_COMPLETE。

  • 請注意:當系統開始清除LRU快取中的程序時,雖然它首先按照LRU的順序來執行操作,但是它同樣會考慮程序的記憶體使用量以及其他因素。佔用越少的程序越容易被留下來。

4)資原始檔需要選擇合適的資料夾進行存放

我們知道 hdpi/xhdpi/xxhdpi 等等不同dpi的資料夾下的圖片在不同的裝置上會經過scale的處理。例如我們只在hdpi的目錄下放置了一張100100的圖片,那麼根據換算關係,xxhdpi的手機去引用那張圖片就會被拉伸到200200。需要注意到在這種情況下,記憶體佔用是會顯著提高的。對於不希望被拉伸的圖片,需要放到assets或者nodpi的目錄下。

5)Try catch某些大記憶體分配的操作

在某些情況下,我們需要事先評估那些可能發生OOM的程式碼,對於這些可能發生OOM的程式碼,加入catch機制,可以考慮在catch裡面嘗試一次降級的記憶體分配操作。例如decode bitmap的時候,catch到OOM,可以嘗試把取樣比例再增加一倍之後,再次嘗試decode。

6)謹慎使用static物件

因為static的生命週期過長,和應用的程序保持一致,使用不當很可能導致物件洩漏,在Android中應該謹慎使用static物件。
這裡寫圖片描述

7)特別留意單例物件中不合理的持有

雖然單例模式簡單實用,提供了很多便利性,但是因為單例的生命週期和應用保持一致,使用不合理很容易出現持有物件的洩漏。

8)珍惜Services資源

如果你的應用需要在後臺使用service,除非它被觸發並執行一個任務,否則其他時候Service都應該是停止狀態。另外需要注意當這個service完成任務之後因為停止service失敗而引起的記憶體洩漏。 當你啟動一個Service,系統會傾向為了保留這個Service而一直保留Service所在的程序。這使得程序的執行代價很高,因為系統沒有辦法把Service所佔用的RAM空間騰出來讓給其他元件,另外Service還不能被Paged out。這減少了系統能夠存放到LRU快取當中的程序數量,它會影響應用之間的切換效率,甚至會導致系統記憶體使用不穩定,從而無法繼續保持住所有目前正在執行的service。 建議使用IntentService,它會在處理完交代給它的任務之後儘快結束自己。更多資訊,請閱讀Running in a Background Service

9)優化佈局層次,減少記憶體消耗

越扁平化的檢視佈局,佔用的記憶體就越少,效率越高。我們需要儘量保證佈局足夠扁平化,當使用系統提供的View無法實現足夠扁平的時候考慮使用自定義View來達到目的。

10)謹慎使用“抽象”程式設計

很多時候,開發者會使用抽象類作為”好的程式設計實踐”,因為抽象能夠提升程式碼的靈活性與可維護性。然而,抽象會導致一個顯著的額外記憶體開銷:他們需要同等量的程式碼用於可執行,那些程式碼會被mapping到記憶體中,因此如果你的抽象沒有顯著的提升效率,應該儘量避免他們。

11)使用nano protobufs序列化資料

Protocol buffers是由Google為序列化結構資料而設計的,一種語言無關,平臺無關,具有良好的擴充套件性。類似XML,卻比XML更加輕量,快速,簡單。如果你需要為你的資料實現序列化與協議化,建議使用nano protobufs。關於更多細節,請參考protobuf readme的”Nano version”章節。

12)謹慎使用依賴注入框架

使用類似Guice或者RoboGuice等框架注入程式碼,在某種程度上可以簡化你的程式碼。下面是使用RoboGuice前後的對比圖:
這裡寫圖片描述
這裡寫圖片描述
使用RoboGuice之後,程式碼是簡化了不少。然而,那些注入框架會通過掃描你的程式碼執行許多初始化的操作,這會導致你的程式碼需要大量的記憶體空間來mapping程式碼,而且mapped pages會長時間的被保留在記憶體中。除非真的很有必要,建議謹慎使用這種技術。

13)謹慎使用多程序

使用多程序可以把應用中的部分元件執行在單獨的程序當中,這樣可以擴大應用的記憶體佔用範圍,但是這個技術必須謹慎使用,絕大多數應用都不應該貿然使用多程序,一方面是因為使用多程序會使得程式碼邏輯更加複雜,另外如果使用不當,它可能反而會導致顯著增加記憶體。當你的應用需要執行一個常駐後臺的任務,而且這個任務並不輕量,可以考慮使用這個技術。

一個典型的例子是建立一個可以長時間後臺播放的Music Player。如果整個應用都執行在一個程序中,當後臺播放的時候,前臺的那些UI資源也沒有辦法得到釋放。類似這樣的應用可以切分成2個程序:一個用來操作UI,另外一個給後臺的Service。

14)使用ProGuard來剔除不需要的程式碼

ProGuard能夠通過移除不需要的程式碼,重新命名類,域與方法等等對程式碼進行壓縮,優化與混淆。使用ProGuard可以使得你的程式碼更加緊湊,這樣能夠減少mapping程式碼所需要的記憶體空間。

15)謹慎使用第三方libraries

很多開源的library程式碼都不是為行動網路環境而編寫的,如果運用在移動裝置上,並不一定適合。即使是針對Android而設計的library,也需要特別謹慎,特別是在你不知道引入的library具體做了什麼事情的時候。例如,其中一個library使用的是nano protobufs, 而另外一個使用的是micro protobufs。這樣一來,在你的應用裡面就有2種protobuf的實現方式。這樣類似的衝突還可能發生在輸出日誌,載入圖片,快取等等模組裡面。另外不要為了1個或者2個功能而匯入整個library,如果沒有一個合適的庫與你的需求相吻合,你應該考慮自己去實現,而不是匯入一個大而全的解決方案。

16)考慮不同的實現方式來優化記憶體佔用

在某些情況下,設計的某個方案能夠快速實現需求,但是這個方案卻可能在記憶體佔用上表現的效率不夠好。例如:
這裡寫圖片描述
對於上面這樣一個時鐘錶盤的實現,最簡單的就是使用很多張包含指標的錶盤圖片,使用幀動畫實現指標的旋轉。但是如果把指標扣出來,單獨進行旋轉繪製,顯然比載入N多張圖片佔用的記憶體要少很多。當然這樣做,程式碼複雜度上會有所增加,這裡就需要在優化記憶體佔用與實現簡易度之間進行權衡了。

寫在最後:

  • 設計風格很大程度上會影響到程式的記憶體與效能,相對來說,如果大量使用類似Material
  • Design的風格,不僅安裝包可以變小,還可以減少記憶體的佔用,渲染效能與載入效能都會有一定的提升。
  • 記憶體優化並不就是說程式佔用的記憶體越少就越好,如果因為想要保持更低的記憶體佔用,而頻繁觸發執行gc操作,在某種程度上反而會導致應用效能整體有所下降,這裡需要綜合考慮做一定的權衡。

相關推薦

關於Android效能優化的簡單總結

Android效能優化 Android效能優化主要分幾大類:1。app啟動優化  2.佈局優化   3. 響應優化    4.記憶體優化   5.網路優化      一。效能分析工具     1。Hierarchy Viewer提供了一個視覺化的介面來檢測佈局的層級,讓我

Android效能優化——如何避免OOM總結

從四個方面著手,首先是減小物件的記憶體佔用,其次是記憶體物件的重複利用,然後是避免物件的記憶體洩露,最後是記憶體使用策略優化。 減小物件的記憶體佔用 避免OOM的第一步就是要儘量減少新分配出來的物件佔用記憶體的大小,儘量使用更加輕量的物件。 1)使用更加輕

Android中內存泄露與如何有效避免OOM總結

ignore create ui線程 nbsp weak solver 部分 ont 占用 一、關於OOM與內存泄露的概念 我們在Android開發過程中經常會遇到OOM的錯誤,這是因為我們在APP中沒有考慮dalvik虛擬機內存消耗的問題。 1

Android效能優化----經典總結

Android 效能優化典範(一):主要從 Android 的渲染機制、記憶體與 GC、電量優化三個方面展開,介紹了 Android 中效能問題的底層工作原理,以及如何通過工具來找出效能問題及提升效能的建議。 Android 效能優化典範(二):主要內容為:電量優化、網路優化、Android W

Android如何避免OOM總結

前面介紹了一些基礎的記憶體管理機制以及OOM的基礎知識,那麼在實踐操作當中,有哪些指導性的規則可以參考呢?歸納下來,可以從四個方面著手,首先是減小物件的記憶體佔用,其次是記憶體物件的重複利用,然後是避免物件的記憶體洩露,最後是記憶體使用策略優化。 1)使用更加輕量的資料結構

自己的Android效能優化總結

前言: 之前效能優化相關的學習都是靠查資料學,效能優化相關的內容挺多的,自己來做個總結吧!有時間自己就把之前寫的筆記整理一點,一點一點積累。 apk瘦身 使用progard 使用webp圖片 使用向量圖 移除未使用的資源 儘量使用系統資源

Android效能優化總結

1. 緣由 Android系統每隔16ms發出VSYNC訊號,對UI進行渲染,如果每次渲染都成功,就能夠達到流暢的畫面所需要的60fps,為了能夠實現60fps,這意味著程式的大多數操作都必須在16ms內完成,時間超出16ms越多,丟的幀就越多。 假設我

Android 效能優化總結和彙總

對於Android開發者而言,開發出一個應用程式已經不是很難的問題。但是,如果要想開發出優質的應用或者程式就需要知道如何優化應用以及對程式效能優化的一些知識。那麼如何去優化程式呢?安卓框架已經提供了很好的工具來幫助開發者做這件事情。廢話少說,進入正題。 A.

Android 效能優化總結

6、合理選擇容器,在效能上優先考慮陣列,即使我們現在習慣了使用容器,也要注意頻繁使用容器在效能上的隱患點:首先是擴容開銷, HashMap擴容時重新Hash的開銷較大。其次是記憶體開銷,HashMap需要額外的Map.Entry物件分配 ,需要額外記憶體,也容易產生更多的記憶體碎片。SparseArray和

Android——效能優化之SparseArray

相信大家都用過HashMap用來存放鍵值對,最近在專案中使用HashMap的時候發現,有時候 IDE 會提示我這裡的HashMap可以用SparseArray或者SparseIntArray等等來代替。 SparseArray(稀疏陣列).它是Android內部特有的api,標準的jdk是沒有這

Android效能優化之較精確的獲取影象顯示到螢幕上的時間

轉載自:http://blog.desmondyao.com/android-show-time/ 這兩天我的包工頭歪龍木·靈魂架構師·王半仙·Yrom給我派了一個活:統計App冷啟動時間。這個任務看上去不難,但是要求統計出來的時間要準,要特別準。 意思就是,我必須要按Activity繪製到

Android效能優化——介面流暢度優化

Android效能優化——介面流暢度優化   序言 首先流暢度不僅僅是受到程式碼的影響。也會跟機器的硬體配置有關係。所以第一點需要明確的是,流暢度最低保證在哪個硬體配置之上。這樣有了一個基點之後,才能比較好明確優化目標。不然你拿一個兩三年前的機子來做優化。那就真的是吃力不討好的

Android效能優化之圖片壓縮優化

1 分類Android圖片壓縮結合多種壓縮方式,常用的有尺寸壓縮、質量壓縮、取樣率壓縮以及通過JNI呼叫libjpeg庫來進行壓縮。 參考此方法:Android-BitherCompress 備註:對於資源圖片直接使用:tiny壓縮 2 質量壓縮(1)原理:保持畫素的前提下改變圖片的位深及透明度,(即:通

SQL效能優化(不斷總結

1.查詢的模糊匹配      儘量避免在一個複雜查詢裡面使用 LIKE '%parm1%'—— 紅色標識位置的百分號會導致相關列的索引無法使用,最好不要用. 解決辦法: 其實只需要對該指令碼略做改進,查詢速度便會提高近百倍。改進方法如下:  &nbs

Android效能優化—不建議使用列舉Enum

最近優化App,由於專案中使用了Lib,而Lib程式碼中包含了大量的列舉型別,導致App佔用記憶體過多。好吧,知道問題點,那就幹掉,拋棄之~ 問題是解決了,為啥會這樣呢? 先來看看Android官網的說明吧: 看見了吧,Android官網不建議咱們使用enums,說的也很清楚了,佔用記憶體多(E

Android 效能優化——記憶體篇

歡迎轉載,轉載請標明出處【Hoolay Team】: http://www.cnblogs.com/hoolay/p/6278229.html Author : Hoolay Android Team  Chiclaim 一、android官方一

【藝術探索筆記】第 15 章 Android 效能優化

第 15 章 Android 效能優化 Android 裝置作為一種移動裝置,不管是記憶體還是 CPU 的效能都受到了一定的限制,無法像 PC 那樣具有超大的記憶體和高效能的 CPU。所以 Android 程式不可能無限制的使用記憶體和 CPU 資源,過多的使

面試被問之-----sql優化中in與exists的區別 Mysql中 in or exists not exists not in區別 (網路整理) Sql語句中IN和exists的區別及應用 [筆記] SQL效能優化 - 避免使用 IN 和 NOT IN

曾經一次去面試,被問及in與exists的區別,記得當時是這麼回答的:''in後面接子查詢或者(xx,xx,xx,,,),exists後面需要一個true或者false的結果",當然這麼說也不算錯,但別人想聽的是sql優化相關,肯定是效率的問題,只是那個時候確實不知道它們在sql優化上的區別,只知道用in會進

Android效能優化之apk瘦身技巧

隨著專案迭代,新功能的增加。回導致apk越大。那麼在下載安裝過程中。使用者耗費的流量越多。 安裝等待的時間也會越長。這就意味著下載轉化率會越低。那麼如何apk瘦身呢? 理解APK結構 在討論怎麼減小Apk體積之前,理解一個應用的APK結構是非常有幫助的。一個ap

Android 效能優化大全

佈局優化 1.減少佈局巢狀的層級 2.相對於RelativeLayout,更適合用LinearLayout 3.使用<include>和<merge>以及ViewStub標籤繪製優化 1.onDraw方法裡面儘量不要建立新的物件 2.onDraw方法中儘量不要執行耗時操作