Ⅰ static和非static修飾的變數哪個生命周期長
被static修飾的變數生命周期更長,因為靜態變數的生命周期取決於類的生命周期。它在類載入的時候被分配空間。
Ⅱ android static 什麼時候被回收
android中,定義的static變數屬於全局變數,不會被GC回收,它們會一直佔用內存。直到程序結束時才會被回收。
Android是用Java開發,其靜態變數的生命周期遵守Java的設計。靜態變數是在類被load的時候分配內存的,並且存在於方法區。當類被卸載的時候,靜態變數被銷毀。在PC機的客戶端程序中,一個類被載入和卸載,可簡單的等同於jvm進程的啟動和結束。
一、靜態變數在類被載入的時候分配內存。
當啟動一個app的時候,系統會創建一個進程,此進程會載入一個Dalvik VM的實例,然後代碼就運行在DVM之上,類的載入和卸載,垃圾回收等事情都由DVM負責。也就是說在進程啟動的時候,類被載入,靜態變數被分配內存。
二、靜態變數在類被卸載的時候銷毀。
一般情況下,所有的類都是默認的ClassLoader載入的,只要ClassLoader存在,類就不會被卸載,而默認的ClassLoader生命周期是與進程一致的。
Ⅲ Android 性能優化的方法是什麼請從開發者的角度回答!
常我們寫程序,都是在項目計劃的壓力下完成的,此時完成的代碼可以完成具體業務邏輯,但是性能不一定是最優化的。一般來說,優秀的程序員在寫完代碼
之後都會不斷的對代碼進行重構。重構的好處有很多,其中一點,就是對代碼進行優化,提高軟體的性能。下面我們就從幾個方面來了解Android開發過程中
的代碼優化。
1)靜態變數引起內存泄露
在代碼優化的過程中,我們需要對代碼中的靜態變數特別留意。靜態變數是類相關的變數,它的生命周期是從這個類被聲明,到這個類徹底被垃圾回收器回收
才會被銷毀。所以,一般情況下,靜態變數從所在的類被使用開始就要一直佔用著內存空間,直到程序退出。如果不注意,靜態變數引用了佔用大量內存的資源,造
成垃圾回收器無法對內存進行回收,就可能造成內存的浪費。
先來看一段代碼,這段代碼定義了一個Activity。
復制代碼 代碼如下:
private static Resources mResources;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
if (mResources == null) {
mResources = this.getResources();
}
}
這段代碼中有一個靜態的Resources對象。代碼片段mResources =
this.getResources()對Resources對象進行了初始化。這時Resources對象擁有了當前Activity對象的引
用,Activity又引用了整個頁面中所有的對象。
如果當前的Activity被重新創建(比如橫豎屏切換,默認情況下整個Activity會被重新創建),由於Resources引用了第一次創建
的Activity,就會導致第一次創建的Activity不能被垃圾回收器回收,從而導致第一次創建的Activity中的所有對象都不能被回收。這個
時候,一部分內存就浪費掉了。
經驗分享:
在實際項目中,我們經常會把一些對象的引用加入到集合中,如果這個集合是靜態的話,就需要特別注意了。當不需要某對象時,務必及時把它的引用從集合中清理掉。或者可以為集合提供一種更新策略,及時更新整個集合,這樣可以保證集合的大小不超過某值,避免內存空間的浪費。
2)使用Application的Context
在Android中,Application
Context的生命周期和應用的生命周期一樣長,而不是取決於某個Activity的生命周期。如果想保持一個長期生命的對象,並且這個對象需要一個
Context,就可以使用Application對象。可以通過調用Context.getApplicationContext()方法或者
Activity.getApplication()方法來獲得Application對象。
依然拿上面的代碼作為例子。可以將代碼修改成下面的樣子。
復制代碼 代碼如下:
private static Resources mResources;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
if (mResources == null) {
// mResources = this.getResources();
mResources = this.getApplication().getResources();
}
}
在這里將this.getResources()修改為
this.getApplication().getResources()。修改以後,Resources對象擁有的是Application對象的引
用。如果Activity被重新創建,第一次創建的Activity就可以被回收了。
Ⅳ 全局變數和靜態變數為什麼在進程的整個生命周期都可以訪問
剛學習C語言的時候,就知道全局變數和靜態變數在程序運行的整個生命周期都可以訪問,而局部變數只能在聲明變數的函數中才可以訪問,出了聲明局部變數的函數,局部變數就被銷毀了。也知道是因為局部變數是在進程的棧(stack)上分配的,而全局變數和靜態變數是在某個段(segment)中的。可一直還是有點迷迷糊糊的樣子,感覺不是很清楚。 最近在看Windows的內存管理和PE文件的格式,突然感覺這個問題變得清楚了很多。在Windows中,exe文件是直接映射到進程的地址空間的,而全局變數和靜態變數是在生成的exe文件的某個段中,也就是說,當exe文件映射到進程的地址空間後,全局變數和靜態變數就被映射到進程的地址空間,所以在程序運行的整個周期內,全局變數和靜態變數都是可以訪問的。而局部變數是在進程的棧上分配的,當函數執行完畢後,棧要恢復,所以局部變數只能在函數中使用。
Ⅳ 靜態局部變數的生命周期
所有靜態變數的生命周期都為程序的周期。
Ⅵ Android 編程中,使用靜態變數有哪些缺點應該如何規范使用
靜態變數有如下缺點:
1、 靜態局部變數在靜態存儲區內分配存儲單元。在程序整個運行期間都不釋放,即佔用較多空間。
2、不能保存動態的數據。
3、靜態變數容易導致多個窗體共同訪問時出現混亂,並且在多個窗體類的多個實例之間傳遞的時候不具有相互獨立性,訪問頻繁的時候比較節約資源 。
4、靜態變數存放在內存的堆區,可以保存到整個程序結束,生命周期較長。
對於靜態變數少用可以,不能到處都用。
Ⅶ 用static定義的變數的生命周期
全局變數和靜態變數的存儲是放在一塊的,初始化的全局變數和靜態變數在一塊區域, 未初始化的全局變數和未初始化的靜態變數在相鄰的另一塊區域。 當類首次被載入時static定義的變數被分配空間,程序結束後由系統釋放.
如果在一個程序里過多的使用static定義的成員,確實很占內存,因為他的生命周期是整個程序,程序運行時無法被gc所回收,直到程序結束,釋放內存.
Ⅷ 靜態變數
eeprom是存儲器,靜態變數是的生命周期是程序執行期間,RAM數據斷電後不能保存。
除非有斷電保護,並執行代碼把變數的值存儲到非易失性存儲器(EEPROM或FLASH中)
或者用電池供電的RAM中。
除非常量,和程序代碼,變數一般存儲在RAM中,
所以任何存儲類型的變數,都跟實際的存儲器不相干,數據存儲除了程序執行期間的存儲的數據外,程序代碼和常量數據,都是燒寫EEPROM或FLASH中的,跟程序的運行無關!!
存儲器的分配是系統製作者安排的事情!和程序關系不大!!!