JAVA初級工程師面試36問(完結)

第三十一問:   說一下線程中sleep()和wait()區別?

 

        1 . sleep()是讓正在執行的線程主動讓出CPU,當時間到了,在回到自己的線程讓程序運行。但是它並沒有釋放同步資源鎖只是讓出

         2.wait()是讓當前線程暫時退讓出同步資源鎖,讓其他線程來獲取到這個同步資源在調用notify()方法,纔會讓其解除wait狀態,再次參與搶資源。

        3. sleep()方法可以在任何地方使用,而wait()只能在同步方法或同步塊使用。

 

第三十二問:   請問spring是如何處理循環依賴的?

 

              spring中主要是採用了三級緩存的一種模式來解決循環依賴,內在就是三個緩存的map結構。他們分別是singletonObjects,singletonFactories,earlySingletonObjects。(此圖是網上看到的,感覺很不錯,如侵權告知刪除)

  解釋:

singletonObjects:一級緩存,存儲beanName(key)和bean實例(value)之間的關係,這裏存儲的bean實例是已經完全創建完成的bean實例

earlySingletonObjects:二級緩存,也是存儲beanName和bean實例之間的關係,注意和singletonObjects的區別,這裏存儲的bean實例是沒有創建完成的bean實例,即該bean還在創建過程中,爲了解決循環引用的問題,將未創建完全的bean緩存起來。
singletonFactories:三級緩存,用於保存beanName和bean工廠之間的關係。當三級緩存創建bean成功後,會將bean放入二級緩存,並將beanName對應的beanFactory從singletonFactories中移除。

ObjectFactory:有getobject()方法,在創建單例bean的過程中,爲了解決循環依賴問題,會創建beanName對應的ObjectFactory放入SingletonFactoies中,達到提前曝光bean的目的。三級緩存singletonFactory.getObject()(三級緩存)獲取,如果獲取到了則:
    this.earlySingletonObjects.put(beanName, singletonObject);
    this.singletonFactories.remove(beanName);

爲什麼要三級緩存?
       getEarlyBeanReference中支持AwareBeanPostProcessor這樣的後置處理器,給用戶提供接口擴展的。

 

第三十三問:   請問springboot 微服務 如何解決跨域問題?

 

     1.方法級別的跨域訪問

 

                

     2.全局跨域訪問

               

 

第三十四問:   請問JVM 有哪些基本的垃圾回收算法?

          

   一、按照基本回收策略

               1.引用計數 :  

                   對象有一個引用,即增加一個計數,刪除一個引用則減少一個計數。垃圾回收時,只用收集計數爲0的對象(無法解決循環引用)

              2.標記-清除

                    此算法分爲兩個階段.第一階段從引用根節點開始標記所有被引用的對象,第二階段遍歷整個堆,把沒有標記的對象清除(需要暫停整個應用,同時會產生碎片)

              3.複製

                   此算法把內存空間劃爲兩個相等的區域,每次只使用其中一個區域。垃圾回收時,遍歷當前使用區域,把正在使用中的對象複製到另外一個區域中(每次只處理正在使用中的對象,不會出現“碎片”問題。就是需要兩倍內存空間) 

             4.標記-整理

                  此算法結合了“標記-清除”和“複製”兩個算法的優點。也是分兩階段,第一階段從根節點開始標記所有被引用對象,第二階段遍歷整個堆,把清除未標記對象並且把存活對象“壓縮”到堆的其中一塊,按順序排放。避免了碎片問題,也避免了“複製”算法的空間問題。

     二、按分區對待的方式

             1.增量收集

                   實時垃圾回收算法,即在應用進行的同時進行垃圾回收

             2.分代收集

 

                 基於對對象生命週期分析後得出的垃圾回收算法。把對象分爲年青代、年老代、持久代,對不同生命週期的對象使用不同的算法(上述方式中的一個)進行回收。現在的垃圾回收器(從J2SE1.2開始)都是使用此算法的.

 

 

 

      三、按系統線程

               1.串行收集

                 串行收集使用單線程處理所有垃圾回收工作,因爲無需多線程交互,實現容易,而且效率比較高。但是,其侷限性也比較明顯,即無法使用多處理器的優勢,所以此收集適合單處理器機器。當然,此收集器也可以用在小數據量(100M左右)情況下的多處理器機器上。

            2.並行收集

                 並行收集使用多線程處理垃圾回收工作,速度快,效率高。而且理論上CPU數目越多,越能體現出並行收集器的優勢。

            3.併發收集

                 相對於串行收集和並行收集而言,前面兩個在進行垃圾回收工作時,需要暫停整個運行環境,而只有垃圾回收程序在運行,因此,系統在垃圾回收時會有明顯的暫停,而且暫停時間會因爲堆越大而越長。

 

第三十五問:   請問JVM 如何解決同時存在的對象創建和對象回收問題?

 

       1.垃圾回收線程是回收內存的,而程序運行線程則是消耗(或分配)內存的,一個回收內存,一個分配內存,從這點看,兩者是矛盾的。

       2.因此,在現有的垃圾回收方式中,要進行垃圾回收前,一般都需要暫停整個應用(即:暫停內存的分配),然後進行垃圾回收,回收完成後再繼續應用。(缺點:當堆空間持續增大時,垃圾回收的時間也將會相應的持續增大,對應應用暫停的時間也會相應的增大。就是一些對相應時間要求很高的應用,比如最大暫停時間要求是幾百毫秒,那麼當堆空間大於幾個G時,就很有可能超過這個限制,在這種情況下,垃圾回收將會成爲系統運行的一個瓶頸。

      3.併發垃圾回收算法,使用這種算法,垃圾回收線程與程序運行線程同時運行。在這種方式下,解決了暫停的問題,但是因爲需要在新生成對象的同時又要回收對象,算法複雜性會大大增加,系統的處理能力也會相應降低,同時,“碎片”問題將會比較難解決.

     因此,針對不同引用做不同的調優處理.

 

第三十六問:   談談你對Http協議與TCP協議簡單理解?

             1.Tcp協議對應着傳輸層,而HTTP協議對應着應用層;

             2.從本質上而言,他們之間是沒有區別的,因爲http協議是建立在TCP協議之上的,比如,當我們發送一個http的請求,那麼http就會通過tcp來建立一個連接到服務的一個通道,Http會立即將TCP斷開,因此我們也說http是一種短連接或者無狀態連接。

          那什麼叫無狀態或者短鏈接?

            1. 所謂的無狀態,是指瀏覽器每次向服務器發起請求的時候,不是通過一個連接,而是每次都建立一個新的連接。如果是一個連接的話,服務器進程中就能保持這個連接並且在內存中記住一些信息狀態,而每次請求結束後,連接就關閉,相關的內容就釋放了,所以記不住狀態,成爲了無狀態連接。

            2.如果我們每次訪問一個頁面都要建 立一個TCP的連接,那效率就慢了,從HTTP/1.1開始,默認都開啓了Keep-Alive,保持連接性,也就是說當一個網頁打開完成後,http數據的tcp連接不會再關閉了,會有一個保持的時間,但是這個時間一到也會自動關閉。而http是短連接,tcp是長連接。因爲,http每次請求完後就會關閉,而通過socket編程使用TCP協議的時候,控制開關閉的代碼在我們手上,我們只要不關閉就會讓連接狀態一直保持着。

 

         後:

              至此,三十六問系列全部結束,每一個問題都可以發散帶每一面,每個知識點,想要弄清除底層很多東西 就需要不斷學習探索了,  希望可以幫助你們得面試,幫助你們鞏固知識

   

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章