java靜態(tài)代碼檢測(cè) java靜態(tài)代碼檢查

如何分析android的oom,與java靜態(tài)代碼分析工具

在Android平臺(tái)上面,應(yīng)用程序OOM異常永遠(yuǎn)都是值得關(guān)注的問(wèn)題。通常這一塊也是程序這中的重點(diǎn)之一。這下我就如何解決OOM作一點(diǎn)簡(jiǎn)單的介紹。

潛山網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),潛山網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為潛山1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的潛山做網(wǎng)站的公司定做!

首先,OOM就是內(nèi)存溢出,即Out Of Memory。也就是說(shuō)內(nèi)存占有量超過(guò)了VM所分配的最大。

怎么解決OOM,通常OOM都發(fā)生在需要用到大量?jī)?nèi)存的情況下(創(chuàng)建或解析Bitmap,分配特大的數(shù)組等),在這樣的一種情況下,就可能出現(xiàn)OOM,據(jù)我現(xiàn)在了解到,多數(shù)OOM都是因?yàn)锽itmap太大。所以,這里我就專門(mén)針對(duì)如何解決Bitmap的OOM。其實(shí)最核發(fā)的就是只加載可見(jiàn)范圍內(nèi)的Bitmap,試想這樣一種情況,在GridView或ListView中,數(shù)據(jù)量有5000,每一屏只顯示20個(gè)元素,那么不可見(jiàn)的,我們是不需要保存Bitmap在內(nèi)在中的。所以我們就是只把那么可見(jiàn)的Bitmap保留在內(nèi)存中,那些不可見(jiàn)的,就釋放掉。當(dāng)元素滑出來(lái)時(shí),再去加載Bitmap。

這里我有兩種方式,都可以避免OOM。

一,主動(dòng)釋放Bitmap的內(nèi)存

這種方式我簡(jiǎn)單說(shuō)一下,不太推薦,這也是我最開(kāi)始使用的一種方法,但最后證明它不是最好的。(不推薦)

它的本質(zhì)思路是:

1、只加載可見(jiàn)區(qū)域的Bitmap

2、滑動(dòng)時(shí)不加載

3、停止滑動(dòng)(Idle)后,開(kāi)始重新加載可見(jiàn)區(qū)域的圖片

4、釋放滑出可見(jiàn)區(qū)域的Bitmap的內(nèi)在。

它比較復(fù)雜:

1、我們需要監(jiān)聽(tīng)GridView/ListView的滑動(dòng)事件,這個(gè)很簡(jiǎn)單做到,AbsListView#setOnScrollListener(OnScrollListener l)

2、主動(dòng)調(diào)用Bitmap#recycle()方法,它會(huì)導(dǎo)致一個(gè)問(wèn)題,必須判斷這個(gè)Bitmap是否被一個(gè)View(ImageView等)所引用,如果被引用,我們不能簡(jiǎn)單地調(diào)用recycle()方法,這樣會(huì)導(dǎo)致異常,說(shuō)是View使用了一個(gè)已經(jīng)被回收的Bitmap。

3,我們必須設(shè)計(jì)自己的線程來(lái)控制開(kāi)始/暫停等,因?yàn)镚ridView/ListView的滑動(dòng)狀態(tài)可能不斷地變化,也就是說(shuō)滑動(dòng)-停止-滑動(dòng),這種狀態(tài)可能不斷變化,這樣就會(huì)導(dǎo)致我們的線程中的run()方法里面的邏輯比較復(fù)雜,一旦復(fù)雜,問(wèn)題就可能就得更多。

基于以上幾點(diǎn),這種方式不是最好的,所以不推薦。

二,設(shè)計(jì)Cache

這種方式,我覺(jué)得是比較好的一種,它首先利用了cache,我認(rèn)為cache是一個(gè)很重要的東西,把Bitmap的內(nèi)存單獨(dú)放在一個(gè)地方來(lái)管理,這個(gè)地方就是cache,它的容量是一定的,我們可能會(huì)不斷的向這個(gè)cache中添加元素,也可能不斷的移除元素。

為了更好的說(shuō)明這種方式,先要介紹一下LruCache。

LruCache

1、這其實(shí)就是一個(gè)LinkedHashMap,任意時(shí)刻,當(dāng)一個(gè)值被訪問(wèn)時(shí),它就會(huì)被移動(dòng)到隊(duì)列的開(kāi)始位置,所以這也是為什么要用LinkedHashMap的原因,因?yàn)橐l繁的做移動(dòng)操作,為了提高性能,所以要用LinkedHashMap。當(dāng)cache滿了時(shí),此時(shí)再向cache里面添加一個(gè)值,那么,在隊(duì)列最后的值就會(huì)從隊(duì)列里面移除,這個(gè)值就有可能被GC回收掉。

JAVA 靜態(tài)代碼塊和非靜態(tài)代碼塊 作用?

靜態(tài)代碼塊是在類加載進(jìn)jvm時(shí)類實(shí)例化之前運(yùn)行的,比如業(yè)務(wù)場(chǎng)景有這種類初始化時(shí)需要加載許多資源,在運(yùn)行實(shí)例化類的時(shí)候會(huì)影響程序響應(yīng)時(shí)間,所以就在項(xiàng)目啟動(dòng)的時(shí)候加載類的時(shí)候就初始化了.非靜態(tài)代碼塊是在類實(shí)例化的時(shí)候才會(huì)運(yùn)行,所以靜態(tài)代碼塊的執(zhí)行一定在非靜態(tài)代碼塊執(zhí)行之前執(zhí)行.至于你上面的第一個(gè)問(wèn)題要看具體業(yè)務(wù)場(chǎng)景和需求,賦值都可以實(shí)現(xiàn).第二個(gè)問(wèn)題,可能是寫(xiě)那句代碼的人要看程序加載后有沒(méi)有執(zhí)行那部分代碼而加上的,知道了靜態(tài)代碼塊和非靜態(tài)代碼塊的本質(zhì)區(qū)別,為什么那么做和目的你就應(yīng)該知道了.

關(guān)于java靜態(tài)代碼塊的詳細(xì)運(yùn)行過(guò)程問(wèn)題

當(dāng)你裝載Chinese類的時(shí)候就會(huì)首先執(zhí)行靜態(tài)代碼塊,所以你執(zhí)行Chinese.sing(); 這句的時(shí)候首先裝載Chinese類,這時(shí)初始化這個(gè)類的時(shí)候就會(huì)先執(zhí)行靜態(tài)代碼塊 static { count =2; System.out.println("static code"); }

名稱欄目:java靜態(tài)代碼檢測(cè) java靜態(tài)代碼檢查
網(wǎng)頁(yè)URL:http://muchs.cn/article8/dosciop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版網(wǎng)站建設(shè)、商城網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)、面包屑導(dǎo)航網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)