當前位置:首頁 » 安卓系統 » android優化內存

android優化內存

發布時間: 2022-08-16 07:55:23

㈠ android為什麼要內存優化

  1. android為什麼要內存優化是為了防止Android的內存溢出

  2. Android的內存溢出是如何發生的?
    Android的虛擬機是基於寄存器的Dalvik,它的最大堆大小一般是16M,有的機器為24M。因此所能利用的內存空間是有限的。如果內存佔用超過了一定的水平就會出現OutOfMemory的錯誤。
    為什麼會出現內存不夠用的情況呢?原因主要有兩個:

  3. 由於程序的失誤,長期保持某些資源(如Context)的引用,造成內存泄露,資源造成得不到釋放。

  4. 保存了多個耗用內存過大的對象(如Bitmap),造成內存超出限制。

在android的開發中,要時刻主要內存的分配和垃圾回收,因為系統為每一個dalvik虛擬機分配的內存是有限的,在google的G1中,分配的最大堆大小隻有16M,後來的機器一般都為24M,實在是少的可憐。這樣就需要在開發過程中要時刻注意。不要因為自己的代碼問題而造成OOM錯誤。

Android的優化方式

  1. Android的程序由java語言編寫,所以Android的內存管理與Java的內存管理相似。程序員通過new為對象分配內存,所有對象在java堆內分配空間;然而對象的釋放是由垃圾回收器來完成的。C/C++中的內存機制是「誰污染,誰治理」,java的就比較人性化了,給我們請了一個專門的清潔工(GC)。


  2. 那麼GC怎麼能夠確認某一個對象是不是已經被廢棄了呢?Java採用了有向圖的原理。Java將引用關系考慮為圖的有向邊,有向邊從引用者指向引用對象。線程對象可以作為有向圖的起始頂點,該圖就是從起始頂點開始的一棵樹,根頂點可以到達的對象都是有效對象,GC不會回收這些對象。如果某個對象 (連通子圖)與這個根頂點不可達(注意,該圖為有向圖),那麼認為這個(這些)對象不再被引用,可以被GC回收

㈡ android開發內存優化之如何有效避免oom

  1. 減小對象的內存佔用

  2. 內存對象的重復利用

  3. 避免對象的內存泄露

  4. 內存使用策略優化

  • 設計風格很大程度上會影響到程序的內存與性能,相對來說,如果大量使用類似Material Design的風格,不僅安裝包可以變小,還可以減少內存的佔用,渲染性能與載入性能都會有一定的提升。

  • 內存優化並不就是說程序佔用的內存越少就越好,如果因為想要保持更低的內存佔用,而頻繁觸發執行gc操作,在某種程度上反而會導致應用性能整體有所下降,這里需要綜合考慮做一定的權衡。

  • Android的內存優化涉及的知識面還有很多:內存管理的細節,垃圾回收的工作原理,如何查找內存泄漏等等都可以展開講很多。OOM是內存優化當中比較突出的一點,盡量減少OOM的概率對內存優化有著很大的意義。

㈢ android中怎麼實現內存優化

不少人認為JAVA程序,因為有垃圾回收機制,應該沒有內存泄露。其實如果我們一個程序中,已經不再使用某個對象,但是因為仍然有引用指向它,垃圾回收器就無法回收它,當然該對象佔用的內存就無法被使用,這就造成了內存泄露。如果我們的java運行很久,而這種內存泄露不斷的發生,最後就沒內存可用了。當然java的,內存泄漏和C/C++是不一樣的。如果java程序完全結束後,它所有的對象就都不可達了,系統就可以對他們進行垃圾回收,它的內存泄露僅僅限於它本身,而不會影響整個系統的。C/C++的內存泄露就比較糟糕了,它的內存泄露是系統級,即使該C/C++程序退出,它的泄露的內存也無法被系統回收,永遠不可用了,除非重啟機器。
http://www.cnblogs.com/kingOfPointer/archive/2012/12/21/2828018.html
詳細可以參考這個,有圖解教程,希望可以幫到你

㈣ android 性能優化有哪些辦法

性能優化的常用方法

主要內容包括布局優化,繪制優化,內存泄露優化,相應速度優化,ListView優化,Bitmap優化,線程優化等,下面主要給你舉了其中的幾個例子:

(1)布局優化

布局優化的思想很簡單,就是盡量減少布局文件的層級。

如何進行優化呢?首先刪除布局中無用的控制項和層級,其次有選擇地使用性能較低的ViewGroup,比如LinearLayout。如果布局中有的布局既可以用LinearLayout也可以用RelativeLayout,那就用LinearLayout,這是因為RelativeLayout比較復雜,他的布局過程花費更多的CPU時間。FrameLayout和LinearLayout一樣都是一種簡單高效的ViewGroup,因此可以考慮使用他們,但是很多時候,單純的通過一個LinearLayout或者FrameLayout無法實現產品的效果,需要通過嵌套的方式來完成,這種情況建議採用RelativeLayout,因為ViewGroup的嵌套就相當於增加了布局的層級,同樣會降低程序的性能。

布局優化的另一種手段是採用<include>標槍,<merge>標簽和ViewStub。<include>標簽主要用於布局重用,<merge>標簽一般和<include>配合使用,它可以減少布局的層級。而ViewStub則提供了按需載入功能,當需要時才將ViewStub中的布局載入到內存,這提高了程序的初始化效率。

(2)繪制方法

繪制優化是指View的onDraw方法避免執行大量的操作,這主要有兩方面。

首先,onDraw中不要創建新的布局對象,這是因為onDraw方法可能會被頻繁調用,這樣就會在一瞬間產生大量的臨時對象,這不僅佔用了過多的內存而且還會導致系統更加頻繁的gc,降低了程序的執行效率。

另一方面,onDraw方法中不要做耗時的任務,也不能執行成千上萬次循環操作,盡管每次循環都很輕量級,但是大量的循環仍然十分搶佔CPU的時間片,這會造成View的繪制過程不流暢。

(3)內存泄露優化

內存泄露在開發過程中是一個需要重視的問題,但是由於內存泄露問題對開發人員的經驗和開發意識要求比較高,因此這是開發人員最容易犯的錯誤之一。內存泄露的優化分為兩個方面,一方面是在開發過程中避免寫出內存泄露的代碼,另一方面通過一些分析工具比如MAT來找出潛在的內存泄露繼而解決。

關於性能優化的建議

1.避免黃健過多對象;

2.不要過多使用枚舉,枚舉佔用的內存空間比整型大一些。

3.常量使用staticfinal來修飾。

4.使用一些Android特有的數據結構,比如SpareArray和Pair等,他們都具有更好的性能。

5.適當使用軟引用和弱引用。

6.採用內存緩存和磁碟緩存

7.盡量採用靜態內部類,這樣可以避免潛在的內部類而導致的內存泄漏。

㈤ 在Android開發中,有哪些好的內存優化方式

1. 使用更加輕量的數據結構

例如,我們可以考慮使用ArrayMap/SparseArray而不是HashMap等傳統數據結構。通常的HashMap的實現方式更加消耗內存,因為它需要一個額外的實例對象來記錄Mapping操作。另外,SparseArray更加高效,在於他們避免了對key與value的自動裝箱(autoboxing),並且避免了裝箱後的解箱。

2. 避免在Android裡面使用Enum

Android官方培訓課程提到過「Enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android.」,具體原理請參考《Android性能優化典範(三)》,所以請避免在Android裡面使用到枚舉。

3. 減小Bitmap對象的內存佔用

Bitmap是一個極容易消耗內存的大胖子,減小創建出來的Bitmap的內存佔用可謂是重中之重,,通常來說有以下2個措施:

inSampleSize:縮放比例,在把圖片載入內存之前,我們需要先計算出一個合適的縮放比例,避免不必要的大圖載入。

decode format:解碼格式,選擇ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,存在很大差異

4.Bitmap對象的復用

縮小Bitmap的同時,也需要提高BitMap對象的復用率,避免頻繁創建BitMap對象,復用的方法有以下2個措施

LRUCache : 「最近最少使用演算法」在Android中有極其普遍的應用。ListView與GridView等顯示大量圖片的控制項里,就是使用LRU的機制來緩存處理好的Bitmap,把近期最少使用的數據從緩存中移除,保留使用最頻繁的數據,

inBitMap高級特性:利用inBitmap的高級特性提高Android系統在Bitmap分配與釋放執行效率。使用inBitmap屬性可以告知Bitmap解碼器去嘗試使用已經存在的內存區域,新解碼的Bitmap會嘗試去使用之前那張Bitmap在Heap中所佔據的pixel data內存區域,而不是去問內存重新申請一塊區域來存放Bitmap。利用這種特性,即使是上千張的圖片,也只會僅僅只需要佔用屏幕所能夠顯示的圖片數量的內存大小

4. 使用更小的圖片

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

5.StringBuilder

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

6.避免在onDraw方法裡面執行對象的創建

類似onDraw等頻繁調用的方法,一定需要注意避免在這里做創建對象的操作,因為他會迅速增加內存的使用,而且很容易引起頻繁的gc,甚至是內存抖動。

7. 避免對象的內存泄露

類的靜態變數持有大數據對象

靜態變數長期維持到大數據對象的引用,阻止垃圾回收。

非靜態內部類存在靜態實例

非靜態內部類會維持一個到外部類實例的引用,如果非靜態內部類的實例是靜態的,就會間接長期維持著外部類的引用,阻止被回收掉。

資源對象未關閉

資源性對象比如(Cursor,File文件等)往往都用了一些緩沖,我們在不使用的時候,應該及時關閉它們, 以便它們的緩沖及時回收內存。它們的緩沖不僅存在於java虛擬機內,還存在於java虛擬機外。 如果我們僅僅是把它的引用設置為null,而不關閉它們,往往會造成內存泄露。

解決辦法: 比如SQLiteCursor(在析構函數finalize(),如果我們沒有關閉它,它自己會調close()關閉), 如果我們沒有關閉它,系統在回收它時也會關閉它,但是這樣的效率太低了。 因此對於資源性對象在不使用的時候,應該調用它的close()函數,將其關閉掉,然後才置為null. 在我們的程序退出時一定要確保我們的資源性對象已經關閉。 程序中經常會進行查詢資料庫的操作,但是經常會有使用完畢Cursor後沒有關閉的情況。如果我們的查詢結果集比較小, 對內存的消耗不容易被發現,只有在常時間大量操作的情況下才會復現內存問題,這樣就會給以後的測試和問題排查帶來困難和風險,記得try catch後,在finally方法中關閉連接

Handler內存泄漏

Handler作為內部類存在於Activity中,但是Handler生命周期與Activity生命周期往往並不是相同的,比如當Handler對象有Message在排隊,則無法釋放,進而導致本該釋放的Acitivity也沒有辦法進行回收。

安卓手機運行內存太小怎麼進行優化

安卓系統手機為智能機器,和電腦一樣,為了保證手機正常使用,會自動開啟部分程序進程(不是程序),當您清除之後,進程還是會再次顯示。若經常有程序自動啟動佔用手機內存,建議:
1.關閉後台運行的程序:點擊屏幕左下角近期任務鍵-點擊要關閉的應用程序右上角的「X」/下方的關閉全部(部分機器操作方式:長按HOME鍵(主屏幕鍵)啟動任務管理器,點擊左下角餅形圖標,點擊清除RAM數據)。
2.部分機器支持智能管理器或內存管理器,建議通過該功能手動關閉自動運行的應用程序。
3.部分第三方軟體支持開機後自動啟動功能,建議打開自動運行的軟體禁用此功能。

㈦ android 清理內存的方法

  • 1.打開手機,找到手機的「設置」。

    • 2.找到「應用管理」,點擊進入。

      • 3.找到「全部」,點擊任意應用,然後清理應用中的「清理緩存」。

        • 4.所用手機應用都可以這樣來清理手機緩存的。

          備註:最簡單粗魯的辦法就是關機重啟手機,手機就不太卡了

        ㈧ android 內存優化

        android 內存優化?1.內存模型與分布
        我們知道android應用大多是使用java語言進行開發的,這就需要我們了解java的內存模型,此外在android中的應用都是基於Dalvik 虛擬機或者ART虛擬機,那麼對這些虛擬機的內存分布也應該有所了解。
        Java內存分布模型
        上圖是常見的java虛擬機的內存分布圖:

        方法區:主要存儲虛擬機載入的類信息,常量,靜態變數,及時編譯器編譯後的代碼等數據。內存優化時這一部分主要考慮是不是載入了很多不必要的第三方庫。這部分的內存減少主要是常量池的回收和類的卸載(類卸載條件:無引用,類載入器可卸載)

        堆:幾乎所有的對象都在這個區域產生,該區域屬於線程共享的區域,所以寫代碼時更要注意多線程安全。這個內存區域的大小變化主要是對象的創建和回收,比如:如果短時間內有大量的對象創建和回收,可能會造成內存抖動,如果對象創建之後一直回收不掉,則會導致內存泄漏,嚴重的內存泄漏會導致頻繁的gc,從而是界面卡頓。

        虛擬機棧:這個區域描述的是java方法執行的內存模型,我們常說的方法棧的入棧就是將方法的棧幀存儲到虛擬機棧,這個區域是線程私有的,其生命周期就是線程的生命周期。也就是說每個線程都會有,默認一個線程的線程棧大小是1M,這不包括在方法中產生的其他對象的大小。這一塊我們能控制的就是線程的數量,特別是程序中沒有使用線程池或者使用的多個第三方庫都帶有線程池的情況。

        本地方法棧:同虛擬機棧的作用非常類似,是為虛擬機執行native方法服務的,所以需要注意的地方也和虛擬機棧一樣,特別是使用了第三方so的情況

        程序計數器:當前線程執行的虛擬機位元組碼的行號記錄器,佔用的內存較小,可以不考慮

        2.內存限制
        android是基於linux系統的,android中的進程分為兩種:

        1.native進程:採用C/C++實現,不包含dalvik實例的linux進程,/system/bin/目錄下面的程序文件運行後都是以native進程形式存在的

        2.java進程:實例化了dalvik虛擬機實例的linux進程,進程的入口main函數為java函數。dalvik虛擬機實例的宿主進程是fork()系統調用創建的linux進程,所以每一個android上的java進程實際上就是一個linux進程,只是進程中多了一個dalvik虛擬機實例

        我們知道,操作系統對進程的內存是有限制的,而且操作系統對dalvik虛擬機自身的堆內存大小也是有限制的。可以通過如下命令查看限制大小:
        adb shell getprop | grep dalvik.vm.heapgrowthlimit
        可以在Androidmanifest文件中application節點加入android:largeHeap=「true」來增加其dalvik虛擬機中堆的大小

        我們常說的堆大小其實是包涵兩部分的,一是java的堆,而是native的堆,java堆中主要是一下java對象,由 C/C++申請的內存空間則在native堆中,也有一些對象需要結合native和java堆共同完成,比如bitmap,bitmap分為bitmap對象和其中存儲的像素值,對象分配在java堆,而存儲的像素值則根據版本不同存儲的位置也不同,api 11 - api 25是存儲在java堆中的,其他版本是存儲在native堆中的
        3.內存泄漏
        常見的內存泄漏:

        1.靜態引用(自身代碼和第三方代碼)

        2.集合內引用

        3.Handler消息未清除

        4.非靜態的內部類中持有外部內的應用

        5.匿名內部類/非靜態內部類和非同步線程

        檢查的方式:

        我這里使用的是leakcanary,一般簡單的內存泄漏可以直接在leakcanary中查到引用鏈路,不能查看的我是使用MAT來分析的
        當前內存信息

        上圖中各項詳細的指標的意義可以在這里查到,這里主要佔比比較大的幾個區域:

        allocated:表示app內分配的java的對象數,從當前數值可以看出程序內可能存在過多創建對象的情況,比如string對象

        Native:從 C 或 C++ 代碼分配的對象內存,頻繁進出相關頁面發現native堆的大小並沒有減小,說明存在c/c++層的內存泄漏

        Code:您的應用用於處理代碼和資源(如 dex 位元組碼、已優化或已編譯的 dex 碼、.so 庫和字體)的內存。這個區域能優化的就是移除不需要的so庫,懶載入使用so庫,移除無用代碼(import,方法和類)
        4.優化實踐
        了解了android中的內存分布和泄漏相關,接下來就是結合自身業務進行內存優化了,如下:

        1.先解決程序中內存佔用較大的業務模塊中的內存泄漏,不熟悉MAT的使用的可以看看這個

        2.移除程序中多餘的代碼和引用,這里使用默認的lint檢測再配合shrinkResources來刪除無效資源

        3.優化圖片,保證圖片放置在合理的文件夾,根據View大小載入合適的圖片大小,根據手機狀態配置bitmap和回收策略

        4.優化對象創建,比如string,使用對象池等

        ㈨ android 內存優化有哪些方法

        增加優化代碼,在system/build.prop添加指定代碼(有變磚風險),樓主慎重操作,
        或者刷內核,當然也有一些其他的方法,不過對於安卓手機就這樣,除非換手機,畢竟安卓只能拼配置

        ㈩ android 如何更好的回收內存空間,有沒有強

        Android內存優化大全

        OOM:

        內存泄露可以引發很多的問題:

        1.程序卡頓,響應速度慢(內存佔用高時JVM虛擬機會頻繁觸發GC)

        2.莫名消失(當你的程序所佔內存越大,它在後台的時候就越可能被幹掉。反之內存佔用越小,在後台存在的時間就越長)

        3.直接崩潰(OutOfMemoryError)

        ANDROID內存面臨的問題:

        1.有限的堆內存,原始只有16M

        2.內存大小消耗等根據設備,操作系統等級,屏幕尺寸的不同而不同

        3.程序不能直接控制

        4.支持後台多任務處理(multitasking)

        5.運行在虛擬機之上

        5R:

        本文主要通過如下的5R方法來對ANDROID內存進行優化:

        1.Reckon(計算)

        首先需要知道你的app所消耗內存的情況,知己知彼才能百戰不殆

        2.Rece(減少)

        消耗更少的資源

        3.Reuse(重用)

        當第一次使用完以後,盡量給其他的使用

        5.Recycle(回收)

        返回資源給生產流

        4.Review(檢查)

        回顧檢查你的程序,看看設計或代碼有什麼不合理的地方。

        詳細

        熱點內容
        怎麼在電腦上玩手機伺服器 發布:2024-03-29 07:30:13 瀏覽:140
        倍福加密 發布:2024-03-29 07:24:42 瀏覽:843
        如何用密碼鎖住並隱藏工作表 發布:2024-03-29 07:03:28 瀏覽:326
        按鍵精靈滑鼠腳本 發布:2024-03-29 06:47:41 瀏覽:19
        pythonhome 發布:2024-03-29 06:47:36 瀏覽:169
        dns配置錯誤怎麼修理 發布:2024-03-29 06:36:15 瀏覽:980
        電信客戶6位密碼是什麼 發布:2024-03-29 06:35:42 瀏覽:565
        b星演算法找門 發布:2024-03-29 06:27:13 瀏覽:774
        小數化分數c語言 發布:2024-03-29 06:20:16 瀏覽:561
        如何搭建ai伺服器 發布:2024-03-29 06:20:10 瀏覽:493