當前位置:首頁 » 安卓系統 » android程序內存

android程序內存

發布時間: 2022-08-16 20:16:20

㈠ android安裝程序的內存跟程序運行時用的內存是一樣嗎

不一樣,智能手機手機有ROM和RAM兩種內存,ROM中是手機的操作系統以及安裝的軟體,RAM是運行內存(就是程序在運行的時候存放臨時數據的)

㈡ android內存優化

Android內存優化實踐
1.內存模型與分布
我們知道android應用大多是使用java語言進行開發的,這就需要我們了解java的內存模型,此外在android中的應用都是基於Dalvik 虛擬機或者ART虛擬機,那麼對這些虛擬機的內存分布也應該有所了解。
上圖是常見的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開發內存優化之如何有效避免oom

  1. 減小對象的內存佔用

  2. 內存對象的重復利用

  3. 避免對象的內存泄露

  4. 內存使用策略優化

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

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

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

㈣ 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回收

㈤ 如何突破24M內存的限制,為Android程序分配到更多內存

一個Android的應用最多使用16M的內存,如果要突破這個限制,則要使用c/c++編寫JNI,即直接調用底層的函數來處理.linux也是用c/c++來編寫的,因此有非常非常多的函數庫可以調用.

㈥ android系統運行需要多大內存

安卓手機我用過好多,從最早的256M到512M到1G到2G,個人感覺還是2G運行內存的不影響使用,1G的還湊和,再少的話,就非常差了。

㈦ 一個android應用在內存中佔用多少內存

在Android中,一個Process 只能使用16M內存,如果超過了這個限制就會拋出Android Out Of Memory(OOM) 這個異常。 在Android中: 1.一個進程的內存可以由2個部分組成:java 使用內存 ,C 使用內存 ,這兩個內存的和必須小於16M,不然就會出現OOM...

㈧ android 內存問題怎麼分析

使用eclipse 自帶的 DDMS 工具分析各線程的內存使用情況,如下圖所示

Heap視圖界面會定時刷新,在對應用的不斷的操作過程中就可以看到內存使用的變化。

怎樣判斷當前進程是否有內存泄漏呢?
這里需要注意一個值:VM Heap頁面中部有一個data object選項,即數據對象,也就是我們的程序中大量存在的類類型的對象。
在data object一行中有一列是「Total Size」,其值就是當前進程中所有Java數據對象的內存總量,一般情況下,這個值的大小決定了是否會有內存泄漏。如上圖中選中行所示。
可以據此判斷內存有泄漏:
1) 不斷的操作當前應用,或者重復某一動作,注意觀察data object的Total Size值。

2) 正常情況下Total Size值都會穩定在一個有限的范圍內,也就是說如果程序中的的代碼邏輯良好,
沒有創建的對象不被GC機制正常回收的情況,即便 我們不斷的操作生成很多對象,而在虛擬機不斷的進行垃圾回收的過程中,這些對象都被正常回收了,內存使用量會保持在一個比較穩定的水平。

3) 如果代碼中存在對象引用沒有釋放的情況,則data object的Total Size值在每次GC後不會有明顯的回落,隨著操作次數的增多Total Size的值會越來越大。
正常情況下,一個虛擬機的進程的內存在64M, 如果內存泄漏會發現 Heap Size 在不斷的逼近 64M, 一旦達到這個值時,就會出現退出應用等情況。

發生內存泄露,Total Size的值越來越大時,按下「Dump HPROF file」按鈕,這個時候會提示設置hprof文件的保存路徑。保存後,可以對比log來分析是哪些操作造成了內存泄漏。

㈨ android系統大概佔多大的內存那

不是的。不知樓主說的是內存卡還是手機內存。首先要說明,卡上說的是8G,實際只能用7G多。因為生產廠家採用1000為單位,而手機讀取採用1024未單位,所以有誤差。我的android 手機由於有導航,導航佔用了1.5G多。實際系統文件只有幾百M。

熱點內容
編程好軟體 發布:2025-01-16 20:38:07 瀏覽:422
流量密碼如何改成 發布:2025-01-16 20:37:13 瀏覽:49
java判斷是否是對象 發布:2025-01-16 20:31:04 瀏覽:884
python調用外部程序 發布:2025-01-16 20:14:09 瀏覽:396
緩解壓力英語作文 發布:2025-01-16 20:13:31 瀏覽:64
javaname 發布:2025-01-16 20:13:15 瀏覽:21
用戶訪問表空間 發布:2025-01-16 20:07:07 瀏覽:943
java代碼自動編譯 發布:2025-01-16 19:58:14 瀏覽:313
編程很困難 發布:2025-01-16 19:58:09 瀏覽:673
gg登錄源碼 發布:2025-01-16 19:58:07 瀏覽:292