<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          字節(jié)-Android開發(fā)面經(jīng)(七)

          共 3469字,需瀏覽 7分鐘

           ·

          2021-06-07 13:02

          點擊藍(lán)字關(guān)注我們,獲取更多面經(jīng)








          內(nèi)存溢出和內(nèi)存泄漏




          一、定義

          內(nèi)存溢出: 即為out of memory, 當(dāng)你要求分配的內(nèi)存超過了系統(tǒng)給你的內(nèi)存時, 系統(tǒng)就會拋出out of memory的異常(每個Android能用的內(nèi)存是有限的)

          比如: 當(dāng)前應(yīng)用只剩下4M的空間可用, 但你卻加載得到一個需要占用5M空間的圖片Bitmap對象, 就會拋出溢出的異常


          內(nèi)存泄露: 即為memory leak, 一個對象被創(chuàng)建后, 你不再使用它了, 但因為某種原因它又沒有成為垃圾對象, 這塊內(nèi)存不能再被分配置使用.

          比如: 查詢數(shù)據(jù)庫得到的cursor對象在使用完后沒有關(guān)閉, Activity中使用Handler發(fā)延遲消息, 但退出前不移除未處理的消息


          內(nèi)存泄露不多時沒有太大影響, 但積累得多了就會導(dǎo)致應(yīng)用運動緩慢, 到最后就會內(nèi)存溢出.


          二、內(nèi)存泄漏的分類

          常發(fā)性內(nèi)存泄漏: 發(fā)生內(nèi)存泄漏的代碼會被多次執(zhí)行到,每次被執(zhí)行的時候都會導(dǎo)致一塊內(nèi)存泄漏

          偶發(fā)性內(nèi)存泄漏: 發(fā)生內(nèi)存泄漏的代碼只有在某些特定環(huán)境或操作過程下才會發(fā)生。常發(fā)性和偶發(fā)性是相對的。對于特定的環(huán)境,偶發(fā)性的也許就變成了常發(fā)性的

          一次性內(nèi)存泄漏: 發(fā)生內(nèi)存泄漏的代碼只會被執(zhí)行一次,或者由于算法上的缺陷,導(dǎo)致總會有一塊僅且一塊內(nèi)存發(fā)生泄漏

          說明: 危害性大小順序為: 1)>2)>3)


          三、造成內(nèi)存泄露的幾種場景

          長生命周期的對象持有短生命周期對象的引用: Activity中使用Handler

          資源數(shù)據(jù)連接相關(guān)對象不關(guān)閉: cusor, stream, connection

          HashSet中的對象或HashMap中的Key對象, 內(nèi)部與hash值相關(guān)的屬性被修改

          一些對象產(chǎn)生后不會自動釋放或需要完全執(zhí)行完了才釋放. 比如: Bitmap, Thread, AsyncTask


          四、避免內(nèi)存泄露

          盡早釋放無用對象的引用

          使用字符串處理,避免使用String,應(yīng)大量使用StringBuffer,每一個String對象都得獨立占用內(nèi)存一塊區(qū)域

          盡量少用靜態(tài)變量,因為靜態(tài)變量存放在永久代(方法區(qū)),永久代基本不參與垃圾回收

          避免在循環(huán)中創(chuàng)建對象


          五、造成內(nèi)存溢出的的場景

          申請了太多的對象. 比如: 使用ListView時, 不復(fù)用convertView, 當(dāng)數(shù)據(jù)項多時就會出現(xiàn)內(nèi)存溢出

          創(chuàng)建的對象內(nèi)存太大. 比如: 不經(jīng)過壓縮直接加載大圖片文件

          內(nèi)存泄露積累一定的時間后就可能出現(xiàn)


          六、避免內(nèi)存溢出

          通過復(fù)用對象的方式, 減少產(chǎn)生的對象

          大對象需要先壓縮后創(chuàng)建

          避免或減少內(nèi)存泄露的情況






          wait和sleep的區(qū)別




          sleep

          讓當(dāng)前線程休眠指定時間。

          休眠時間的準(zhǔn)確性依賴于系統(tǒng)時鐘和CPU調(diào)度機(jī)制。

          不釋放已獲取的鎖資源,如果sleep方法在同步上下文中調(diào)用,那么其他線程是無法進(jìn)入到當(dāng)前同步塊或者同步方法中的。

          可通過調(diào)用interrupt()方法來喚醒休眠線程。


          wait

          讓當(dāng)前線程進(jìn)入等待狀態(tài),當(dāng)別的其他線程調(diào)用notify()或者notifyAll()方法時,當(dāng)前線程進(jìn)入就緒狀態(tài)

          wait方法必須在同步上下文中調(diào)用,例如:同步方法塊或者同步方法中,這也就意味著如果你想要調(diào)用wait方法,前提是必須獲取對象上的鎖資源

          當(dāng)wait方法調(diào)用時,當(dāng)前線程將會釋放已獲取的對象鎖資源,并進(jìn)入等待隊列,其他線程就可以嘗試獲取對象上的鎖資源。






          內(nèi)部類與靜態(tài)內(nèi)部類區(qū)別




          定義在一個類內(nèi)部的類叫內(nèi)部類,包含內(nèi)部類的類稱為外部類。內(nèi)部類可以聲明public、protected、private等訪問限制,可以聲明 為abstract的供其他內(nèi)部類或外部類繼承與擴(kuò)展,或者聲明為static、final的,也可以實現(xiàn)特定的接口。外部類按常規(guī)的類訪問方式使用內(nèi)部 類,唯一的差別是外部類可以訪問內(nèi)部類的所有方法與屬性,包括私有方法與屬性。


          (1)創(chuàng)建實例

             OutClass.InnerClass obj = outClassInstance.new InnerClass(); //注意是外部類實例.new,內(nèi)部類

             AAA.StaticInner in = new AAA.StaticInner();//注意是外部類本身,靜態(tài)內(nèi)部類


          (2)內(nèi)部類中的this

             內(nèi) 部類中的this與其他類一樣是指的本身。創(chuàng)建內(nèi)部類對象時,它會與創(chuàng)造它的外圍對象有了某種聯(lián)系,于是能訪問外圍類的所有成員,不需任何特殊條件,可理 解為內(nèi)部類鏈接到外部類。用外部類創(chuàng)建內(nèi)部類對象時,此內(nèi)部類對象會秘密的捕獲一個指向外部類的引用,于是,可以通過這個引用來訪問外圍類的成員。


          (3)外部類訪問內(nèi)部類

             內(nèi)部類類似外部類的屬性,因此訪問內(nèi)部類對象時總是需要一個創(chuàng)建好的外部類對象。內(nèi)部類對象通過‘外部類名.this.xxx’的形式訪問外部類的屬性與方法。如:

                 System.out.println("Print in inner Outer.index=" + pouter.this.index);

                 System.out.println("Print in inner Inner.index=" + this.index);


          (4)內(nèi)部類向上轉(zhuǎn)型

             內(nèi)部類也可以和普通類一樣擁有向上轉(zhuǎn)型的特性。將內(nèi)部類向上轉(zhuǎn)型為基類型,尤其是接口時,內(nèi)部類就有了用武之地。如果內(nèi)部類是private的,只可以被它的外部類問,從而完全隱藏實現(xiàn)的細(xì)節(jié)。


          (5)方法內(nèi)的類

             方法內(nèi)創(chuàng)建的類(注意方法中也能定義類),不能加訪問修飾符。另外,方法內(nèi)部的類也不是在調(diào)用方法時才會創(chuàng)建的,它們一樣也被事先編譯了。


          (6)靜態(tài)內(nèi)部類

             定義靜態(tài)內(nèi)部類:在定義內(nèi)部類的時候,可以在其前面加上一個權(quán)限修飾符static。此時這個內(nèi)部類就變?yōu)榱遂o態(tài)內(nèi)部類。


          通常稱為嵌套類,當(dāng)內(nèi)部類是static時,意味著:

             [1]要創(chuàng)建嵌套類的對象,并不需要其外圍類的對象;

             [2]不能從嵌套類的對象中訪問非靜態(tài)的外圍類對象(不能夠從靜態(tài)內(nèi)部類的對象中訪問外部類的非靜態(tài)成員);

             嵌套類與普通的內(nèi)部類還有一個區(qū)別:普通內(nèi)部類的字段與方法,只能放在類的外部層次上,所以普通的內(nèi)部類不能有static數(shù)據(jù)和static字段, 也不能包含嵌套類。但是在嵌套類里可以包含所有這些東西。也就是說,在非靜態(tài)內(nèi)部類中不可以聲明靜態(tài)成員,只有將某個內(nèi)部類修飾為靜態(tài)類,然后才能夠在這 個類中定義靜態(tài)的成員變量與成員方法。

             另外,在創(chuàng)建靜態(tài)內(nèi)部類時不需要將靜態(tài)內(nèi)部類的實例綁定在外部類的實例上。普通非靜態(tài)內(nèi)部類的 對象是依附在外部類對象之中的,要在一個外部類中定義一個靜態(tài)的內(nèi)部類,不需要利用關(guān)鍵字new來創(chuàng)建內(nèi)部類的實例。靜態(tài)類和方法只屬于類本身,并不屬于 該類的對象,更不屬于其他外部類的對象。


          (7)內(nèi)部類標(biāo)識符

             每個類會產(chǎn)生一個.class文件,文件名即為類名。同樣,內(nèi)部類也會產(chǎn)生這么一個.class文件,但是它的名稱卻不是內(nèi)部類的類名,而是有著嚴(yán)格的限制:外圍類的名字,加上$,再加上內(nèi)部類名字。


          (8)為何要用內(nèi)部類?

             1.   內(nèi)部類一般只為其外部類使用;

             2.   內(nèi)部類提供了某種進(jìn)入外部類的窗戶;

             3.   也是最吸引人的原因,每個內(nèi)部類都能獨立地繼承一個接口,而無論外部類是否已經(jīng)繼承了某個接口。因此,內(nèi)部類使多重繼承的解決方案變得更加完整。








          更多面經(jīng)





          阿里-Android開發(fā)面經(jīng)(一)


          百度-Android開發(fā)面經(jīng)(一)


          滴滴-Android開發(fā)面經(jīng)(一)


              掃描二維碼

             獲取更多面經(jīng)

            扶搖就業(yè)  


          瀏覽 34
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  狠狠久| www国产夜插内射视频网站 | 欧美 日韩 国产 成人 | 玖玖视频免费在线观看 | 综合网第一页 |